Python pickle 语法

5
我正在使用最新版本的Python,但在搜索后,似乎找不到任何与我有用的Pickles相关的内容。
我只是简单地按照教程学习如何使用Pickling,但显然在这些教程中可以工作的源代码都无法对我起作用。我怀疑这与教程过时有关。
我尝试过的方式与教程中展示的相同:
import pickle 
lists = [1,2,3,4,5]
pickle.dump(lists, open('log.txt', 'a+')) 

这给了我以下错误:

Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
pickle.dump(lists, open('log.txt', 'a+'))
TypeError: must be str, not bytes

这个

>>> import pickle
>>> unpicklefile = open('log.txt', 'r')
>>> unpickledlist = [1,2,3,4,5]
>>> unpickledlist = pickle.load(unpicklefile)

给我以下错误提示:
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
unpickledlist = pickle.load(unpicklefile)
TypeError: 'str' does not support the buffer interface

感谢您的回复和帮助。

你的代码在我这里运行良好,没有任何错误(除了文件名不匹配)。那么,你实际上遇到了什么错误? - Greg Hewgill
听起来你正在按照一个专为Python 2.x设计的教程进行操作,而实际上你似乎正在使用Python 3.x。这两个版本之间存在微妙的差异,如果你想使用Python 3.x,最好按照专为该版本设计的教程进行操作。 - Greg Hewgill
1个回答

2

'a+' 模式可能会导致问题。如果你使用的是Windows系统,在二进制模式下打开文件会很有用。另外,在重新打开文件之前请务必关闭文件。并确保你写入和读取的是同一个文件('log.txt' 与 'filename'):

import pickle 
lists = [1,2,3,4,5]

f = open('tmp_pickle.pic', 'wb')
pickle.dump(lists, f)
f.close()

f = open('tmp_pickle.pic', 'rb')
unpickledlist = pickle.load(f)
print unpickledlist

这对我来说似乎有效,所以你可能是正确的,问题是因为我使用了'a+'。谢谢你的帮助 :) - user969416
这个答案解决了这个问题,因为在 Python 3.x 中以 'b' 模式打开文件时,期望的是来自写入者的 bytes 而不是未编码的 Unicode 字符串 strpickle 模块期望能够写入 bytes,详见 the pickle.dump documentation ("file 参数必须具有接受单个字节参数的 write() 方法")。 - Greg Hewgill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接