在Python中将列表保存到文件的替代方法
我想把一个列表保存到文件里,这样当我再次加载和读取这个文件时,能得到和原来一样的列表。换句话说,就是在保存和加载的时候,数据类型不会改变。现在我用“写入”这个方法把列表保存到文件里,但当我试图把它加载回内存时,得到的却是字符串,而不是实际的列表。有没有办法在加载后把它们转换回列表?或者我应该换一种保存列表到文件的方法?请注意,我不想使用Pickle这个工具。
谢谢!
编辑:我不想用pickle的原因是,我需要在代码的不同部分一步一步地添加我的列表。因此,我并不能一次性拥有所有的列表来进行pickle。这就是我遇到的问题。它给我的结果是错误的,我想这可能是因为pickle需要所有的信息在一个地方,然后一次性把它们添加到文件里。?我列表里只有整数。
3 个回答
你可以试试 pyyaml,它的一个额外好处是,它生成的文件非常容易让人看懂。
如果你信任输入的数据,可以直接读取文件并使用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基本结构组成:字符串、数字、元组、列表、字典、布尔值和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]
如果你的数据只是一个简单的列表,里面的东西都是基本类型(比如字符串、整数、浮点数),或者是包含这些基本类型的列表和字典,那么你可以使用json。这种方式在不同编程语言之间都能使用(这是不是你对pickle的不满呢?)。
更新 在问题编辑后:“我对pickle的不满是因为我必须在代码的不同部分一步一步地添加我的列表。”
你有没有想过把要用pickle保存的列表先收集起来,然后在最后一次性保存所有的?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"