Python:如何将数据结构以文本格式(非pickle)写入文件
有没有办法把Python的数据结构以文本的形式写入文件呢?
比如说,一个应用程序正在运行,里面有一个变量/对象:OPTIONS = ('ON', 'OFF', )
我需要把这个OPTIONS元组写入另一个文件,但不是以一种特殊的格式(像是“pickle”),而是要原封不动地写成文本:OPTIONS = ('ON', 'OFF', )
我可以一个一个地遍历这个元组,把每个元素写入目标文件,但我在想有没有更简单的方法。
注意:如果我直接写入,会得到以下内容:
fout.write(OPTIONS)
...
TypeError: argument 1 must be string or read-only character buffer, not tuple
3 个回答
1
我不知道你具体的需求是什么,但你可以考虑使用其他的序列化或持久化系统,比如JSON,或者Twisted Jelly,这些格式更容易被人看懂(还有其他的,比如YAML)。
我在一些项目中用过jelly来处理偏好设置文件。它真的很简单好用,但你需要用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))
1
fout.write(str(OPTIONS))
在这个情况下能达到你想要的效果,但在很多其他情况下可能就不行了;用 repr
代替 str
可能更接近你的需求(不过也不一定,因为你表达得太模糊和笼统了,除了这个单一的例子)。
4
你可以使用 repr 这个函数(这个函数对那些有 __repr__()
方法的东西效果很好):
>>> OPTIONS=('ON', 'OFF', )
>>> "OPTIONS="+repr(OPTIONS)
"OPTIONS=('ON', 'OFF')"