Python中的configparser问题
其实我在工作中遇到了瓶颈。我想把一个txt文件导入到我的Python程序中,这个文件里应该有两个整数列表。
下面的程序运行得很好,但我需要通过configparser来导入列表'a'和'b'。
如果有人能帮我就太好了!
我还是Python初学者,所以请尽量用简单的方式回答我...!
程序如下:
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
3 个回答
0
是的,配置解析器可能不是最好的选择……不过如果你真的想用的话,可以试试这个:
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()
0
json
模块对配置文件中的列表支持得更好。与不支持列表的ConfigParser格式相比,建议使用JSON
来处理这类问题。
JSON
(JavaScript对象表示法)是一种轻量级的数据交换格式。它对人类来说易于阅读和编写,对机器来说也容易解析和生成。它基于JavaScript编程语言的一个子集,遵循的是1999年12月发布的ECMA-262第三版标准。JSON是一种文本格式,完全独立于语言,但使用的约定对C语言家族的程序员来说是熟悉的,这个家族包括C、C++、C#、Java、JavaScript、Perl、Python等许多语言。这些特性使得JSON
成为理想的数据交换语言。
由于你的问题看起来像是作业,我给你一个不太优雅的解决办法。可以使用str.split()
和float()
来从配置文件中解析出一个列表。假设文件x.conf
的内容是:
[sect1]
a=[5e6,6e6,7e6,8e6,8.5e6,9e6,9.5e6,10e6,11e6,12e6]
你可以用以下方式解析它:
>>> 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]
>>>
(列表周围的括号可以从配置文件中去掉,这样就不需要使用[1:-1]
这个小技巧了)
0
看起来ConfigParser这个工具并不是最合适的选择。你可以自己实现解析的逻辑,比如:
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)
或者你也可以想出其他的方法来划分你文件中的列表。这取决于你想在文件中如何表示这些内容。