有没有办法将python数据结构作为文本写入文件。
e.g。一个应用程序正在运行并具有变量/对象:OPTIONS =('ON','OFF',)
我需要将OPTIONS元组写入/合并到另一个文件中,而不是作为一个文件 腌制对象,但作为文本,逐字:OPTIONS =('ON','OFF',)
我可以遍历元组,并逐个将元素写入 目标文件,但想知道是否有更简单的方法。
注意:如果我进行“直接”写作,我会得到以下内容:
fout.write(OPTIONS)
...
TypeError: argument 1 must be string or read-only character buffer, not tuple
答案 0 :(得分:4)
您可以使用repr(repr适用于具有__repr__()
方法的内容):
>>> OPTIONS=('ON', 'OFF', )
>>> "OPTIONS="+repr(OPTIONS)
"OPTIONS=('ON', 'OFF')"
答案 1 :(得分:1)
fout.write(str(OPTIONS))
在这种情况下做你想要的,但毫无疑问,在其他许多情况下它不会; repr
而不是str
可能更接近您的愿望(但话可能不会如此,因为您如此模糊和一般地表达它们,超出了这个单一的例子)。
答案 2 :(得分:1)
我不知道您的范围,但您可以使用其他序列化/持久性系统,例如JSON或Twisted Jelly,这些系统更具人性化(还有其他类似YAML)。
我在某些项目中使用果冻作为首选项文件。它非常容易使用,但您必须使用repr()以人类可读的形式保存数据,然后使用eval()将其读回。所以不要对所有内容都这样做,因为使用eval()会带来安全风险。
这是一个美化表示的代码示例(添加缩进):
VERSION = 'v1.1'
def read_data(filename):
return unjelly(eval(open(filename, 'r').read().replace('\n', '').replace('\t', '')))
def write_data(filename, obj):
dump = repr(jelly(obj))
level = 0
nice_dump = ['%s\n' % VERSION]
for char in dump:
if char == '[':
if level > 0:
nice_dump.append('\n' + '\t' * level)
level += 1
elif char == ']':
level -= 1
nice_dump.append(char)
open(filename, 'w').write(''.join(nice_dump))