python 3.4 中序列化对象的错误字符

Bad characters serializing an object in python 3.4

我是 python 的初学者。我不知道为什么我在使用 pickle.dump.

在 .txt 文件中编写字典时会出现错误字符

我是这样做的:

a={test:test1,"hello":"world", 541:123}
f=open("test.txt","wb")
import pickle
pickle.dump(str(a),f)

在我找到的文件中:

€X-   {'hello': 'world', 'test': 'test1', 541: 123}q .

为什么输出中有 €X-q

如果你想 pickle 字典不要在它上面调用 str 只是转储字典,如果你真的想要人类可读的输出使用 json.dump:

import json 

f = open("test.txt","w") # <- no b for json
import pickle
json.dump(f,a)

pickle 不应该是人类可读的格式,当你 pickle.load 它会和你倾倒之前一样。 json.dump 但是会以人类可读的格式转储字典。

嗯,它们是序列化算法的一部分,你不应该太在意它。在您的情况下,预计不会有类似 json 的可读表示。

引用官方 pickle 文档:

There are fundamental differences between the pickle protocols and JSON (JavaScript Object Notation):

  • JSON is a text serialization format (it outputs unicode text, although most of the time it is then encoded to utf-8), while pickle is a binary serialization format;
  • JSON is human-readable, while pickle is not;
  • JSON is interoperable and widely used outside of the Python ecosystem, while pickle is Python-specific;
  • JSON, by default, can only represent a subset of the Python built-in types, and no custom classes; pickle can represent an extremely large number of Python types (many of them automatically, by clever usage of Python’s introspection facilities; complex cases can be tackled by implementing specific object APIs).

此外,您的代码中可能存在一个错误 - 您正在腌制 dict 的字符串表示而不是 dict 本身。

正确的代码如下所示:

import pickle
a = {"test": "test1", "hello": "world", 541: 123}
with open("test.txt", "wb") as f:
    pickle.dump(a, f)

with open("test.txt", "rb") as f:
    loaded = pickle.load(f)
    print(loaded)
    assert loaded == a

Pickle 是一种用于存储 python 对象的二进制格式。您看到奇怪的字符是因为您在文本编辑器中打开了一个二进制文件,它正在努力将文件显示为文本。

如果您尝试将字典写成 JSON 格式,请尝试使用 json 模块而不是 pickle:

>>> a = {"test": "test1", "hello": "world", 541: 123}
>>> f = open("test.txt", "w")
>>> import json
>>> json.dump(a, f) # without the str()

test.txt 的内容将是:

{"hello": "world", "541": 123, "test": "test1"}

请记住,这仅适用于简单的对象,因此如果不进行额外的工作,您将无法写出类似 python class 的实例。

如果你真的想知道泡菜里面发生了什么,看看 PEP 307 and PEP 3154