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 的实例。
我是 python 的初学者。我不知道为什么我在使用 pickle.dump
.
我是这样做的:
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 的实例。