解析文本文件中的键值对

时间:2012-02-06 14:15:02

标签: python file

我是Python的新手,我搜索如何解析.txt文件。 我的.txt文件是一个名单,其计算信息如下:

myfile.txt的

  

var0 = 16
  var1 = 1.12434E10
  var2 = -1.923E-3
  var3 = 920

如何读取值并将它们放在python中的myvar0, myvar1, myvar2, myvar3

6 个答案:

答案 0 :(得分:46)

我建议将值存储在字典中而不是存储在单独的局部变量中:

myvars = {}
with open("namelist.txt") as myfile:
    for line in myfile:
        name, var = line.partition("=")[::2]
        myvars[name.strip()] = float(var)

现在以myvars["var1"]访问它们。如果名称都是有效的python变量名称,您可以将其放在下面:

names = type("Names", [object], myvars)

并访问值,例如names.var1

答案 1 :(得分:4)

我个人通过创建一个只包含所有参数作为变量的.py文件来解决这个问题 - 然后做了:

include PARAMETERS.py

在需要参数的程序模块中。

它有点难看,但非常简单易用。

答案 2 :(得分:1)

正如@kev建议的那样,configparser模块是可行的方法。

然而在某些情况下(我承认有点难看)但是非常简单有效的方法是将myfile.txt重命名为myfile.py并执行from myfile import *(在您之后)修复拼写错误var 0 - > var0

然而,这是非常不安全,因此如果文件来自外部源或可以由恶意攻击者编写,请使用某些来验证数据,而不是盲目地执行它。

答案 3 :(得分:0)

如果一行上有多个以逗号分隔的值,这里是解析它的代码:

    res = {}                                                                                                                                                                                             

    pairs = args.split(", ")                                                                                                                                                                             
    for p in pairs:                                                                                                                                                                                      
        var, val = p.split("=")                                                                                                                                                                          
        res[var] = val                                                                                                                                                                                   

答案 4 :(得分:0)

当文件格式更加精美时(例如注释),请使用 pandas.read_csv

val = u'''var0 = 16
var1 = 1.12434E10
var2 = -1.923E-3
var3 = 920'''
print(pandas.read_csv(StringIO(val), # or read_csv('myfile.txt',
            delimiter='\s*=\s*',
            header=None,
            names=['key','value'],
            dtype=dict(key=numpy.object,value=numpy.object), # or numpy.float64
            index_col=['key']).to_dict()['value'])
# prints {u'var1': u'1.12434E10', u'var0': u'16', u'var3': u'920', u'var2': u'-1.923E-3'}

答案 5 :(得分:0)

字典理解(PEP 274)可用于较短的表达式(60个字符):

d = {k:float(v) for k, v in (l.split('=') for l in open(f))}

编辑:由于@jmb建议(避免使用.readlines()),从72个字符缩短到60个字符。