为什么在 python 中腌制某些东西不保存我保存的确切内容?

Why doesn't pickling something in python save the exact thing I save?

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

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的初学者,所以我不太好。

Pickling 不会创建对象的纯文本表示;它创建一个文件,可以打开该文件以在 Python 中生成相同的对象。此表示形式并非设计为人类可读(因此需要 "unpickle" 使用 pickle.load()。因此您无法使用文本编辑器打开 pickled 文件并期望看到列表。

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

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

pickling 会将对象的表示形式保存到文件中。这不会是一种人类可读的表示形式,它将是一种可以通过再次 unpickling 重新加载到内存中的表示形式。我们可以看到,如果在 pickle 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.

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