Python:如何将数据结构写为文本(不是pickle)

时间:2009-10-03 00:26:22

标签: python

有没有办法将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

3 个答案:

答案 0 :(得分:4)

您可以使用repr(repr适用于具有__repr__()方法的内容):

>>> OPTIONS=('ON', 'OFF', )
>>> "OPTIONS="+repr(OPTIONS)
"OPTIONS=('ON', 'OFF')"

答案 1 :(得分:1)

fout.write(str(OPTIONS))在这种情况下做你想要的,但毫无疑问,在其他许多情况下它不会; repr而不是str可能更接近您的愿望(但话可能不会如此,因为您如此模糊和一般地表达它们,超出了这个单一的例子)。

答案 2 :(得分:1)

我不知道您的范围,但您可以使用其他序列化/持久性系统,例如JSONTwisted 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))