Problem ConfigParser in Python
-
07-07-2019 - |
Frage
Eigentlich bin ich in meiner Arbeit stecken. Ich mag eine txt-Datei in mein Python-Programm importieren, die zwei Listen von intergers haben sollten.
Das folgende Programm funktioniert gut, aber ich brauche die Liste ‚a‘ und ‚b‘ mit Hilfe von ConfigParser zu importieren.
Es wird so schön, wenn jemand mir dabei helfen!
Ich bin ein begineer in Python so versuchen Sie es auf einfache Art und Weise zu beantworten ...!
Das Programm ist wie folgt:
a=[5e6,6e6,7e6,8e6,8.5e6,9e6,9.5e6,10e6,11e6,12e6]
p=[0.0,0.001,0.002,0.003,0.004,0.005,0.006,0.007,0.008,0.009,0.01,0.015,0.05,0.1,0.15,0.2]
b=0
x=0
while b<=10:
c=a[b]
x=0
print '\there is the outer loop\n',c
while x<=15:
k=p[x]
print'here is the inner loop\n',k
x=x+1
b=b+1
Lösung
Scheint, wie ConfigParser nicht das beste Werkzeug für den Job ist. Sie können die Analyse-Logik implementieren youself so etwas wie:
a, b = [], []
with open('myfile', 'r') as f:
for num, line in enumerate(f.readlines()):
if num >= 10:
b.push(line)
else:
a.push(line)
oder Sie können eine andere Logik bilden die Listen in Ihrer Datei devide. Es hängt davon ab, wie Sie wollen, dass es repräsentieren in Sie Datei
Andere Tipps
Ja, der Config-Parser ist wahrscheinlich nicht die beste Wahl ... aber wenn Sie wirklich wollen, versuchen Sie dies:
import unittest
from ConfigParser import SafeConfigParser
from cStringIO import StringIO
def _parse_float_list(string_value):
return [float(v.strip()) for v in string_value.split(',')]
def _generate_float_list(float_values):
return ','.join(str(value) for value in float_values)
def get_float_list(parser, section, option):
string_value = parser.get(section, option)
return _parse_float_list(string_value)
def set_float_list(parser, section, option, float_values):
string_value = _generate_float_list(float_values)
parser.set(section, option, string_value)
class TestConfigParser(unittest.TestCase):
def setUp(self):
self.a = [5e6,6e6,7e6,8e6,8.5e6,9e6,9.5e6,10e6,11e6,12e6]
self.p = [0.0,0.001,0.002,0.003,0.004,0.005,0.006,0.007,0.008,0.009,0.01,0.015,0.05,0.1,0.15,0.2]
def testRead(self):
parser = SafeConfigParser()
f = StringIO('''[values]
a: 5e6, 6e6, 7e6, 8e6,
8.5e6, 9e6, 9.5e6, 10e6,
11e6, 12e6
p: 0.0 , 0.001, 0.002,
0.003, 0.004, 0.005,
0.006, 0.007, 0.008,
0.009, 0.01 , 0.015,
0.05 , 0.1 , 0.15 ,
0.2
''')
parser.readfp(f)
self.assertEquals(self.a, get_float_list(parser, 'values', 'a'))
self.assertEquals(self.p, get_float_list(parser, 'values', 'p'))
def testRoundTrip(self):
parser = SafeConfigParser()
parser.add_section('values')
set_float_list(parser, 'values', 'a', self.a)
set_float_list(parser, 'values', 'p', self.p)
self.assertEquals(self.a, get_float_list(parser, 'values', 'a'))
self.assertEquals(self.p, get_float_list(parser, 'values', 'p'))
if __name__ == '__main__':
unittest.main()
Der json
Modul bietet eine bessere Unterstützung für Listen in Konfigurationsdateien .
Statt der ConfigParser (keine Liste Unterstützung) Format, versuchen Sie es mit JSON
für diesen Zweck.
JSON
(JavaScript Object Notation) ist ein leichtes Datenaustauschformat. Es ist einfach für Menschen zu lesen und zu schreiben. Es ist einfach für Maschinen zu analysieren und zu generieren. Es basiert auf einer Teilmenge der Programmiersprache JavaScript, Standard ECMA-262 3rd Edition - Dezember 1999 JSON ist ein Textformat, das vollständig sprachunabhängig ist, sondern verwendet die Konventionen, die für Programmierer der C-Familie von Sprachen vertraut sind, einschließlich C , C ++, C #, Java, JavaScript, Perl, Python und viele andere. Diese Eigenschaften machenJSON
eine ideale Datenaustauschsprache.
Da Ihre Frage wie Hausaufgaben riecht, werde ich eine hässliche Hack vorschlagen. Verwenden Sie str.split()
und float()
eine Liste aus einer Konfigurationsdatei zu analysieren. Angenommen, die Datei x.conf
enthält:
[sect1]
a=[5e6,6e6,7e6,8e6,8.5e6,9e6,9.5e6,10e6,11e6,12e6]
Sie können es analysieren mit:
>>> import ConfigParser
>>> cf=ConfigParser.ConfigParser()
>>> cf.read(['x.conf'])
['x.conf']
>>> [float(s) for s in cf.get('sect1','a')[1:-1].split(',')]
[5000000.0, 6000000.0, 7000000.0, 8000000.0, 8500000.0, 9000000.0, 9500000.0, 10000000.0, 11000000.0, 12000000.0]
>>>
(Die Klammern um die Liste aus der Konfigurationsdatei gelöscht werden können, so dass der [1:-1]
unnötig hackt)