从文本文件中读取列表

时间:2014-10-03 18:42:11

标签: python

我一直在尝试在用户可读/可编辑的文本文件中存储我的python项目中的一些变量的方法。文本文件的布局如下:

a = "hello"
b = 123
c = [4,5,6]

如您所见,a表示字符串,b表示整数,c表示列表。我到目前为止的代码如下:

for line in file:
    name = line.split('=')[0]
    value = line.split('=')[1]
    vars()[name] = value

它将行拆分为'=',并将第一部分设置为变量名称,将第二部分设置为该变量的值。

然而,当程序运行时,b(123)和c([4,5,6])都不是以整数和列表形式出现,而是保存为字符串。

有什么方法可以将字符串转换为正确的类型吗?或者他们是一个更好(但仍然很简单)的方式来做我想做的事情?

非常感谢任何帮助。谢谢!

3 个答案:

答案 0 :(得分:4)

"或者是他们做我想做的更好(但仍然很简单)的方式?"

选项1 一个简单而好的方法是在python文件中使用字典只需要导入。

<强> myConfig.py

cfg={'a':"hello", 'b':123, 'c':[4,5,6]}

在您的代码中

from myConfig import *
print cfg['a']

您也可以使用indvidual变量而不是字典并执行相同的操作。

选项2

如果您不想要python文件,您可以读取任何其他文件并使用exec逐行执行命令。文档:https://docs.python.org/2/reference/simple_stmts.html#exec

您可以使用execfile,但我相信它已在versoin 3.x文档中停用:https://docs.python.org/2/library/functions.html#execfile

选项3

您还可以使用其他方式:

  1. Python ConfigParser:https://docs.python.org/2/library/configparser.html
  2. YAML文件:http://pyyaml.org/wiki/PyYAMLDocumentation
  3. XML文件:请参阅此示例:     parsing XML configuration file using Etree in python

答案 1 :(得分:2)

以下是一种方法,使用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中。你应该keep data out of your variable names。如果您确实想要将配置变量添加到命名空间,您仍然可以像我这样使用我的函数:

vars().update(config_file('cfg.txt'))

答案 2 :(得分:0)

除了下面的答案,对于简单的数据结构,您可以使用json格式和词典或命名元组:

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模块。