Python:如何将数据结构以文本格式(非pickle)写入文件

2 投票
3 回答
3524 浏览
提问于 2025-04-15 14:46

有没有办法把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')"

撰写回答