[英]Read list from text file
我一直在尝试将python项目中的一些变量存储在用户可读/可编辑的文本文件中的方法。 文本文件的布局如下:
a = "hello"
b = 123
c = [4,5,6]
如您所见,a表示字符串,b表示整数,以及ca列表。 到目前为止,我的代码如下:
for line in file:
name = line.split('=')[0]
value = line.split('=')[1]
vars()[name] = value
它在'='处分割行,并将第一部分设置为变量名称,第二部分设置为该变量的值。
但是,当程序运行时,b(123)和c([4,5,6])不会作为整数和列表出现,而是另存为字符串。
有什么方法可以将字符串转换为正确的类型? 还是他们做我想做的更好(但仍然很简单)的方法?
任何帮助将非常感激。 谢谢!
“或者他们是我尝试做的更好(但仍然很简单)的方式?”
选项1一种简单而有效的方法是仅在导入时在python文件中使用字典。
myConfig.py
cfg={'a':"hello", 'b':123, 'c':[4,5,6]}
在您的代码中:
from myConfig import *
print cfg['a']
您也可以使用单个变量而不是字典并执行相同的操作。
选项2
如果您不想要python文件,则可以读取任何其他文件,并使用exec
逐行执行命令行。 此处的文档: https : //docs.python.org/2/reference/simple_stmts.html#exec
您可以使用execfile
但我相信它在versoin 3.x Docs中已停产: https ://docs.python.org/2/library/functions.html#execfile
选项3
您还可以使用其他方式:
这是使用ast.literal_eval
一种方法:
import ast
def config_file(filename):
result = {}
with open(filename) as f:
for line in f:
line = line.split('=',1)
result[line[0]] = ast.literal_eval(line[1].strip())
return result
print config_file('cfg.txt')
您可能需要在for
循环中添加更多牛肉,例如忽略空行,删除注释等。
另请注意,这会将数据放入dict
,而不放入vars()
dict中。 您应该将数据放在变量名之外 。 如果确实要将配置变量添加到名称空间,则仍然可以像下面这样使用我的函数:
vars().update(config_file('cfg.txt'))
除了下面的答案,对于简单的数据结构,您可以使用json
格式和字典或namedtuple:
import json
from ast import literal_eval
from collections import namedtuple
json_vars = """{
'a' : "hello",
'b' : 123,
'c' : [4,5,6]
}"""
print json_vars
from_json = literal_eval(json_vars)
# or:
# from_json = json.loads(json_vars)
variables = namedtuple('Vars', from_json.keys())(*from_json.values())
print variables
print variables.a
print variables.b
print variables.c
print variables._asdict()
d = dict(variables._asdict())
print d
print d['a']
print d.items()
as_json_again = json.dumps(d, indent=2)
print as_json_again
有关更多高级对象,请参见pickle
模块。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.