【问题标题】:Alternate ways of saving a list into a file in Python在 Python 中将列表保存到文件中的替代方法
【发布时间】:2010-10-06 00:08:03
【问题描述】:

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

【问题讨论】:

  • 为什么不想使用 Pickle?它完全符合您的要求。
  • Pickle 在 Python 文档中:docs.python.org/library/pickle.html
  • 如果您描述了您不想使用 Pickle 的原因会有所帮助,因为它听起来非常适合您的目的。
  • 请尝试格式化您的问题,使其更具可读性,并包括一些您拥有的和想要的示例。它使回答问题变得容易得多。
  • 另外,请描述列表中的项目是什么。

标签: python file list


【解决方案1】:

如果您的数据只是一个列表,其项目为基本类型(例如 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"

【讨论】:

    【解决方案2】:

    如果您信任输入,请使用读入文件并使用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 文字结构: 字符串、数字、元组、列表、 字典、布尔值和无。

    这可用于安全评估 包含 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]
    

    【讨论】:

      【解决方案3】:

      你应该试试pyyaml 额外的好处,它真的是人类可读的文本文件。

      【讨论】:

        猜你喜欢
        • 2010-12-31
        • 2011-06-21
        • 1970-01-01
        • 2021-11-28
        • 1970-01-01
        • 1970-01-01
        • 2014-10-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多