Problema di configurazione in Python
-
07-07-2019 - |
Domanda
In realtà sono bloccato nel mio lavoro. Voglio importare un file txt nel mio programma Python che dovrebbe avere due elenchi di interger.
Il seguente programma funziona bene ma devo importare la lista 'a' e 'b' con l'aiuto di configparser.
Sarebbe così bello se qualcuno mi aiutasse!
Sono un principiante in Python, quindi per favore prova a rispondere in modo semplice ...!
Il programma è il seguente:
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
Soluzione
Sembra che ConfigParser non sia lo strumento migliore per il lavoro. Puoi implementare te stesso la logica di analisi come:
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)
oppure puoi creare qualche altra logica per dividere gli elenchi nel tuo file. Dipende dal modo in cui vuoi rappresentarlo nel tuo file
Altri suggerimenti
Sì, probabilmente il parser di configurazione non è la scelta migliore ... ma se vuoi davvero, prova questo:
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()
Il json
module fornisce migliore supporto per gli elenchi nei file di configurazione.
Invece del formato ConfigParser (nessun supporto elenco), prova a utilizzare JSON
per questo scopo.
JSON
(JavaScript Object Notation) è un formato di scambio dati leggero. È facile per gli umani leggere e scrivere. È facile per le macchine analizzare e generare. Si basa su un sottoinsieme di JavaScript Programming Language, Standard ECMA-262 3a Edizione - Dicembre 1999. JSON è un formato di testo completamente indipendente dal linguaggio ma che utilizza convenzioni familiari ai programmatori della famiglia di linguaggi C, tra cui C , C ++, C #, Java, JavaScript, Perl, Python e molti altri. Queste proprietà rendonoJSON
una lingua di scambio dati ideale.
Dato che la tua domanda puzza di compiti a casa, suggerirò un brutto trucco. Usa str.split ()
e float ()
per analizzare un elenco da un file di configurazione. Supponiamo che il file x.conf
contenga:
[sect1]
a=[5e6,6e6,7e6,8e6,8.5e6,9e6,9.5e6,10e6,11e6,12e6]
Puoi analizzarlo con:
>>> 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]
>>>
(Le parentesi intorno all'elenco potrebbero essere eliminate dal file di configurazione, rendendo superfluo il [1: -1]
hacking)