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

0 投票
3 回答
1689 浏览
提问于 2025-04-16 05:03

我想把一个列表保存到文件里,这样当我再次加载和读取这个文件时,能得到和原来一样的列表。换句话说,就是在保存和加载的时候,数据类型不会改变。现在我用“写入”这个方法把列表保存到文件里,但当我试图把它加载回内存时,得到的却是字符串,而不是实际的列表。有没有办法在加载后把它们转换回列表?或者我应该换一种保存列表到文件的方法?请注意,我不想使用Pickle这个工具。
谢谢!
编辑:我不想用pickle的原因是,我需要在代码的不同部分一步一步地添加我的列表。因此,我并不能一次性拥有所有的列表来进行pickle。这就是我遇到的问题。它给我的结果是错误的,我想这可能是因为pickle需要所有的信息在一个地方,然后一次性把它们添加到文件里。?我列表里只有整数。

3 个回答

0

你可以试试 pyyaml,它的一个额外好处是,它生成的文件非常容易让人看懂。

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基本结构组成:字符串、数字、元组、列表、字典、布尔值和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]
4

如果你的数据只是一个简单的列表,里面的东西都是基本类型(比如字符串、整数、浮点数),或者是包含这些基本类型的列表和字典,那么你可以使用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"

撰写回答