从文本文件中获取变量值的最佳方法是什么?

63 投票
11 回答
226335 浏览
提问于 2025-04-15 11:54

关于这个问题,我有一个类似但不完全相同的问题。

我有一个文本文件,里面的内容结构是这样的:

var_a: 'home'
var_b: 'car'
var_c: 15.5

我希望Python能读取这个文件,然后创建一个叫做var_a的变量,值为'home',依此类推。

举个例子:

#python stuff over here
getVarFromFile(filename) #this is the function that im looking for
print var_b
#output: car, as string
print var_c
#output 15.5, as number.

这样做可能吗?我想问的是,能不能保持变量的类型?

请注意,我可以自由设计文本文件的结构,如果我提议的格式不是最好的,我可以使用其他格式。

编辑:ConfigParser可能是一个解决方案,但我不太喜欢,因为在我的脚本中,我需要用

config.get("set", "var_name")

来引用文件中的变量。

但我更希望能直接引用变量,就像我在Python脚本中声明的一样……

有没有办法把这个文件导入为Python字典?

哦,最后一点,请记住,我不确定文本文件中会有多少个变量。

编辑2:我对stephan的JSON解决方案很感兴趣,因为这样文本文件可以用其他语言(比如PHP,然后通过AJAX的JavaScript)简单读取,但在尝试这个解决方案时我遇到了一些问题:

#for the example, i dont load the file but create a var with the supposed file content
file_content = "'var_a': 4, 'var_b': 'a string'"
mydict = dict(file_content)
#Error: ValueError: dictionary update sequence element #0 has length 1; 2 is required
file_content_2 = "{'var_a': 4, 'var_b': 'a string'}"
mydict_2 = dict(json.dump(file_content_2, True))
#Error:
#Traceback (most recent call last):
#File "<pyshell#5>", line 1, in <module>
#mydict_2 = dict(json.dump(file_content_2, True))
#File "C:\Python26\lib\json\__init__.py", line 181, in dump
#fp.write(chunk)
#AttributeError: 'bool' object has no attribute 'write'

使用JSON格式时,我可能会遇到什么问题?我该如何读取文本文件中的JSON数组,并将其转换为Python字典?

附注:我不喜欢使用.py文件的解决方案;我更喜欢.txt、.inc或其他不限制于一种语言的格式。

11 个回答

37

你可以把你的文本文件当作一个Python模块来使用,并通过imp.load_source动态加载它:

import imp
imp.load_source( name, pathname[, file]) 

举个例子:

// mydata.txt
var1 = 'hi'
var2 = 'how are you?'
var3 = { 1:'elem1', 2:'elem2' }
//...

// In your script file
def getVarFromFile(filename):
    import imp
    f = open(filename)
    global data
    data = imp.load_source('data', '', f)
    f.close()

# path to "config" file
getVarFromFile('c:/mydata.txt')
print data.var1
print data.var2
print data.var3
...
107

不过我希望能直接引用我在Python脚本中声明的变量。

如果你愿意稍微改变一下写法,可以直接使用Python,并导入“config”模块。

# myconfig.py:

var_a = 'home'
var_b = 'car'
var_c = 15.5

然后这样做:

from myconfig import *

这样你就可以在当前的环境中通过名字来引用它们了。

19

首先,你需要用 JSONPyYAML 这个工具来加载你的文件,把它放进一个叫 the_dict 的字典里(具体的操作可以参考JSON或PyYAML的文档,这两种工具都能存储数据类型)。接着,你可以把这个字典添加到全局字典里,比如用 globals().update(the_dict) 这个方法。

如果你想把它放在一个局部字典里(比如在一个函数里面),你可以这样做:

for (n, v) in the_dict.items():
    exec('%s=%s' % (n, repr(v)))

只要使用 exec 是安全的。如果不安全,你可以直接使用这个字典。

撰写回答