在Python中将列表保存到文件中的替代方法

时间:2010-10-06 00:08:03

标签: python file list

我正在尝试将列表保存到文件中,当我加载并再次读取文件时,我会按原样获取列表。换句话说,保存和加载时数据类型不会更改。因为现在,我使用“write”将我的列表保存到文件中,当我尝试将其加载回内存时,我得到字符串而不是真实列表。有没有办法在加载后将它们转换回列表?或者我应该改变将列表保存到文件中的方式。请注意,我不想使用Pickle。 谢谢  编辑:我的问题是我必须在代码的不同部分逐步添加我的列表。因此,我没有一次列出所有列表所以我可以腌制它们。这就是我遇到的问题。它给了我错误的答案,我想这是因为pickle需要一个地方的所有信息并立即将它们添加到文件中。 (?) 我的名单中只有整数。

3 个答案:

答案 0 :(得分:4)

如果您的数据只是一个列表,其项目是基本类型(例如str,unicode,int,float)以及其元素等等的列表或词组,那么您可以使用json;这是可以跨语言移植的(这是你的问题吗?)。

问题编辑后的

更新“”“我的问题是,我必须在代码的不同部分逐步添加我的列表”“”

您是否考虑过收集清单以便在找到它们时进行腌制,然后在最后一次腌制所有这些清单?同样适用于json等所有你需要的是一个容器来保存你的列表。你可以通过将它放在一个类中来使它看起来更好。

class Preserver(object):
    def __init__(self):
        self._bottle = []
    def add(self, an_object):
        self._bottle.append(an_object)
    def preserve(self, filepath):
        # code using pickle or json to push self._bottle
        # out to a file named "filepath"

答案 1 :(得分:1)

如果您信任输入,请使用读取文件并使用eval

>>> a_list = [1, 3, 5]
>>> with open('test.txt', 'w') as f:
...     f.write(str(a_list))
... 
>>> with open('test.txt') as f:
...     read_list = eval(f.readlines()[0])
... 
>>> read_list
[1, 3, 5]

您还可以使用 ast.literal_eval (python 2.6+),这比我的eval建议更安全。

来自文档:

  

安全地评估表达式节点或   包含Python的字符串   表达。字符串或节点   提供的可能只包括   遵循Python文字结构:   字符串,数字,元组,列表,   dicts,booleans和None。

     

这可用于安全评估   包含Python表达式的字符串   来自不受信任的来源,没有   需要自己解析价值观。

例如:

>>> import ast
>>> a_list = [1, 3, 5]
>>> with open('test.txt', 'w') as f:
...     f.write(repr(a_list))
... 
>>> with open('test.txt') as f:
...     read_list = ast.literal_eval(f.readlines()[0])
... 
>>> read_list
[1, 3, 5]

答案 2 :(得分:0)

你应该尝试pyyaml额外奖励它是真正的人类可读文本文件。