【问题标题】:Why doesn't pickling something in python save the exact thing I save?为什么在 python 中腌制某些东西不能保存我保存的确切内容?
【发布时间】:2020-01-01 19:56:51
【问题描述】:

我有一个问题,当我腌制某些东西时,它不会将确切的文本保存到我保存的内容中。我想保存的是一个列表,但是在代码中它向列表中添加了一些东西(我不知道这是否会影响它)。

import pickle

inventoryFile = 'inventory.file'

with open(inventoryFile, "wb") as fi:
    pickle.dump(inventory, fi)

with open(inventoryFile, "rb") as fi:
    inventory = pickle.load(fi)

inventory 是我不断添加的列表。当我查看inventory.file 文件时,它所说的只是

�]q�.

我不知道这是什么意思。另外我是Python的初学者,所以我不太擅长。

【问题讨论】:

  • 查看inventory.file 是什么意思?你的意思是当你在 python 之外的文件系统中查看它时?
  • 你唯一需要担心的是.load()返回的inventory对象是否正确。

标签: python save pickle


【解决方案1】:

腌制某些东西不会创建对象的纯文本表示;它创建一个文件,可以打开该文件以在 Python 中生成相同的对象。此表示并非设计为人类可读的(因此需要使用pickle.load()“解压”它。因此,您无法使用文本编辑器打开腌制文件并期望看到列表。

如果pickle.load(fi) 生成的列表与您保存的列表相同,则酸洗正常。如果您想创建一个人类可读的文件,请尝试:

  • 将列表转换为字符串(例如', '.join(seq))并保存
  • 另一个数据存储模块(如jsoncsvpandas

【讨论】:

    【解决方案2】:

    pickling 会将对象的表示保存到文件中。这不会是人类可读的表示,它将是一个可以通过再次解开它来重新加载到内存中的表示。如果在对inventory 进行酸洗后,我们可以看到这一点,我们将其设置为None,然后我们通过 pickle 从文件中加载它,您会看到我们得到了与列表完全相同的表示形式。

    import pickle
    
    inventoryFile = 'inventory.file'
    inventory = [1,2,3]
    print(inventory)
    with open(inventoryFile, "wb") as fi:
        pickle.dump(inventory, fi)
    
    inventory = None
    print(inventory)
    
    with open(inventoryFile, "rb") as fi:
            inventory = pickle.load(fi)
    print(inventory)
    

    输出

    [1, 2, 3]
    None
    [1, 2, 3]
    

    如果我们从纯文本编辑器中查看文件,我们会看到

    �]q (KKKe.
    

    但这并不是为人类可读而设计的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2020-07-06
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多