Python pickle/unpickle 到/从文件中提取列表

Posted

技术标签:

【中文标题】Python pickle/unpickle 到/从文件中提取列表【英文标题】:Python pickle/unpickle a list to/from a file 【发布时间】:2013-08-14 10:19:30 【问题描述】:

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

a = [['a string', [0, 0, 0], [22, 'bee sting']], ['see string', 
    [0, 2, 0], [22, 'd string']]]

在保存和检索它时遇到问题。

我可以用pickle保存它:

with open('afile','w') as f:
    pickle.dump(a,f)

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

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'

我曾认为我可以转换为 numpy 数组并使用 savesavezsavetxt。但是我收到以下错误:

>>> 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

【问题讨论】:

而不是pickle.load('afile') 做pickle.load(open('afile')) 当然!谢谢 - 你为什么不把它作为答案.. 你不能轻易地将你拥有的东西转换成numpy.array,因为它的形状不规则。您必须制作一个大的常规数组,然后用NaN 或类似的东西填充所有数据……基本上就是pandas 为您所做的。但是,对于您的小清单来说,这可能有点矫枉过正。 【参考方案1】:

决定将其作为答案。 pickle.load 方法期望获得一个类似对象的文件,但您提供的是一个字符串,因此是一个异常。所以而不是:

pickle.load('afile')

你应该这样做:

pickle.load(open('afile', 'rb'))

【讨论】:

也许是open('afile', 'rb')pickle 文档中的注释:确保始终以二进制模式打开使用协议 >= 1 创建的 pickle 文件。【参考方案2】:

添加到@Rapolas K 的答案:

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

with open('afile','rb') as f:
     pickle.load(f)

【讨论】:

以上是关于Python pickle/unpickle 到/从文件中提取列表的主要内容,如果未能解决你的问题,请参考以下文章

python中怎样转到指定目录

python中怎样转到指定目录

Python 从入门到精通推荐看哪些书籍呢?

Python从入门到精通— 初识Python

Python从入门到精通— 初识Python

Python从入门到精通— 初识Python