Python对文件进行pickle/unpickle列表

ato*_*3ls 20 python file-io pickle

我有一个如下所示的列表:

a = [['a string', [0, 0, 0], [22, 'bee sting']], ['see string', 
    [0, 2, 0], [22, 'd string']]]
Run Code Online (Sandbox Code Playgroud)

并且在保存和检索它时遇到问题.

我可以使用泡菜保存它:

with open('afile','w') as f:
    pickle.dump(a,f)
Run Code Online (Sandbox Code Playgroud)

但是当我尝试加载它时会出现以下错误:

pickle.load('afile')

Traceback (most recent call last):
  File "<pyshell#116>", line 1, in <module>
    pickle.load('afile')
  File "C:\Python27\lib\pickle.py", line 1378, in load
    return Unpickler(file).load()
  File "C:\Python27\lib\pickle.py", line 841, in __init__
    self.readline = file.readline
AttributeError: 'str' object has no attribute 'readline'
Run Code Online (Sandbox Code Playgroud)

我以为我可以转换为numpy数组并使用save,savez或者savetxt.但是我收到以下错误:

>>> np.array([a])

Traceback (most recent call last):
  File "<pyshell#122>", line 1, in <module>
    np.array([a])
ValueError: cannot set an array element with a sequence
Run Code Online (Sandbox Code Playgroud)

Rap*_* K. 36

决定将其作为答案.pickle.load方法希望得到一个像object这样的文件,但是你提供了一个字符串,因此是一个例外.所以代替:

pickle.load('afile')
Run Code Online (Sandbox Code Playgroud)

你应该做:

pickle.load(open('afile', 'rb'))
Run Code Online (Sandbox Code Playgroud)

  • 也许是'开('afile','rb')`.来自`pickle`文档的注释:*确保始终打开在二进制模式下使用协议> = 1创建的pickle文件.* (2认同)

ato*_*3ls 16

添加到@ Rapolas K的答案:

我发现我没有关闭文件的问题所以使用这个方法:

with open('afile','rb') as f:
     pickle.load(f)
Run Code Online (Sandbox Code Playgroud)