【问题标题】:Writing and reading a list from a file in Python在 Python 中从文件中写入和读取列表
【发布时间】:2016-07-12 09:37:02
【问题描述】:

我想将 python 中的列表保存到一个文件中,该文件应该能够稍后读取并添加到列表变量中以供以后使用。

举个例子

list = [42,54,24,65]

这应该写成一个文件

[42,54,24,65] or
list = [42,54,24,65]

并且应该能够稍后从 python 中读取以供以后使用并将其分配给列表变量

现在我正在使用以下代码。

    f = open('list_file', 'w')
    f.write(values)
    f.close()

这给了我一个错误

TypeError: write() argument must be str, not list

我该如何解决这个问题? 谢谢

【问题讨论】:

  • 保存和加载对象以及使用pickle:stackoverflow.com/q/4530611/584846
  • 你试过write(str(values))吗?
  • @BrentWashburne 我是 python 新手,请你告诉我 pickle 是我必须安装的外部模块还是内置的?
  • pickle 模块是标准 python 库的一部分,import pickle。或者,您可以将其写在 json 中,这也是标准 python 库的一部分。
  • @BrentWashburne Pickle 可以解决问题,谢谢 :)

标签: python


【解决方案1】:

您也可以使用pickle 来实现它,它的工作方式与 json 类似,但它可以序列化比 json 更广泛的 Python 对象集。 Json 序列化文本,人类可读,而 pickle 序列化字节,人类不可读。

考虑这个例子:

import pickle, json

list_ = [42,54,24,65]

with open('list_file.pickle', 'wb') as fp, open('list_file.json', 'w') as fj:
    pickle.dump(list_, fp)
    json.dump(list_, fj)

with open('list_file.pickle', 'rb') as fp, open('list_file.json', 'r') as fj:
    list_unpickled = pickle.load(fp)
    list_from_json = json.load(fj)

print(list_unpickled) #[42, 54, 24, 65]
print(list_from_json) #[42, 54, 24, 65]

请注意,使用 pickle 您必须打开带有“b”的文件才能进行二进制读/写。

附注:不要使用与 python 关键字同名的变量,例如list

根据文档中的 12.1.4:

可以腌制以下几种:

  • 无、真和假
  • 整数、浮点数、复数
  • 字符串、字节、字节数组
  • 仅包含可提取对象的元组、列表、集合和字典
  • 在模块顶层定义的函数(使用 def,而不是 lambda)
  • 在模块顶层定义的内置函数
  • 在模块顶层定义的类
  • 这些类的实例,其 dict 或调用 getstate() 的结果是可腌制的(有关详细信息,请参阅腌制类实例部分)。

【讨论】:

    【解决方案2】:

    如果您只有一个简单的列表,那么您可以使用 JSON 和 json 模块。

    import json
    data = [42,54,24,65]
    
    with open('output.txt', 'w') as f_out:
        json.dump(data, f_out)
    
    with open('output.txt', 'r') as f_in:
        data2 = json.load(f_in)
    print(data2) # [42,54,24,65]
    

    output.txt的内容看起来像

    [42,54,24,65]
    

    【讨论】:

    • 任何不使用json.dump(data, f_out)data2 = json.load(f_in) 的理由都可以避免转换为字符串。
    • @AChampion 已编辑。我最初尝试过,但不记得语法。文件指针放错了位置。
    【解决方案3】:

    首先将列表中的所有值映射到字符串,write 方法只支持字符串。 例如。 list = list(map(str, list)) 调用变量“list”也是一种不好的做法,请使用“ls”之类的东西或与标准 Python 关键字不同的东西。如果您想稍后使用它,您可以使用空格分隔值。就像f.write(" ".join(list))一样写。然后,要将其读回列表,请执行 list = f.readline().split() 但是,这会将列表中的值保留为字符串,要将它们恢复为整数,请再次映射 list = list(map(int, list))

    【讨论】:

    • 您所做的只是将列表的内容转换为字符串。这无助于将列表写入文件。
    • @cricket_007 是的,对不起,不再是了
    • 还有更好的方法将对象序列化到文件中。
    【解决方案4】:

    根据代码中的错误,您将列表传递给 f.write()。您需要传递字符串。

    我假设你想每行写一个单词。试试下面的代码应该可以工作。

    f = open('list_file', 'w')
    for value in list:
           f.write(value+"\n")
    f.close() 
    

    要稍后阅读,您可以再次打开文件并使用以下代码阅读:

    f = open('list_file', 'r')
    for line in f:
          print line.strip()
    f.close() 
    

    【讨论】:

      【解决方案5】:

      把我的评论变成答案:

      试试Saving and loading objects and using pickle:

      import pickle
      filehandler = open(b"Fruits.obj","wb")
      pickle.dump(banana,filehandler)
      

      要加载数据,请使用:

      file = open("Fruits.obj",'r')
      object_file = pickle.load(file)
      

      【讨论】:

        猜你喜欢
        • 2020-04-17
        • 2013-06-17
        • 2021-06-26
        • 1970-01-01
        • 1970-01-01
        • 2012-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多