为什么我的 python 不能 pickle 一个 dict?

2016-08-30 23:29:53 +08:00
 aihimmel
In [159]: a
Out[159]:
{'AveryJL': 4,
'Railgunsssss': 8,
u'SWER\u5fae': 4,
u'TMD\u6b7b\u5ea6\u5a18': 8,
'airman1': 4,
'csh841486967': 4,
'oi99o': 4,
'uwookim': 4,
'wy101574658': 8,
'zzz1230456789': 4,
u'\u4e03\u591c\u8bd7\u5e0c': 4,
u'\u4e3f\u521d\u97f3Kong': 4,
u'\u4e50\u56ed\u7684\u53a8\u5e08\u957f': 4,
u'\u51b3\u65ad\u795e\u66f2': 4,
u'\u58c1\u5427\u5427\u52a1\u7ec4': 4,
u'\u6211\u662f\u6700\u840c\u7684\u5b69\u6b62': 4,
u'\u6c64\u67d2\u67d2': 8,
u'\u6dfa\u77b3Rory': 4,
u'\u756a\u7ec4\u767e\u79d1': 8,
u'\u83cabishi': 16,
u'\u865a\u6570\u9b54\u672f': 4,
u'\u94c3\u4e0e\u601c\u7269\u8bed': 4}

In [160]: pickle.dumps(a)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-160-ffc7f744baa1> in <module>()
----> 1 pickle.dumps(a)

c:\python27\lib\pickle.pyc in dumps(obj, protocol)
1378 def dumps(obj, protocol=None):
1379 file = StringIO()
-> 1380 Pickler(file, protocol).dump(obj)
1381 return file.getvalue()
1382

c:\python27\lib\pickle.pyc in dump(self, obj)
222 if self.proto >= 2:
223 self.write(PROTO + chr(self.proto))
--> 224 self.save(obj)
225 self.write(STOP)
226

c:\python27\lib\pickle.pyc in save(self, obj)
284 f = self.dispatch.get(t)
285 if f:
--> 286 f(self, obj) # Call unbound method with explicit self
287 return
288

c:\python27\lib\pickle.pyc in save_dict(self, obj)
653
654 self.memoize(obj)
--> 655 self._batch_setitems(obj.iteritems())
656
657 dispatch[DictionaryType] = save_dict

c:\python27\lib\pickle.pyc in _batch_setitems(self, items)
666 if not self.bin:
667 for k, v in items:
--> 668 save(k)
669 save(v)
670 write(SETITEM)

c:\python27\lib\pickle.pyc in save(self, obj)
329
330 # Save the reduce() output and finally memoize the object
--> 331 self.save_reduce(obj=obj, *rv)
332
333 def persistent_id(self, obj):

c:\python27\lib\pickle.pyc in save_reduce(self, func, args, state, listitems, di
ctitems, obj)
423
424 if state is not None:
--> 425 save(state)
426 write(BUILD)
427

c:\python27\lib\pickle.pyc in save(self, obj)
284 f = self.dispatch.get(t)
285 if f:
--> 286 f(self, obj) # Call unbound method with explicit self
287 return
288

c:\python27\lib\pickle.pyc in save_dict(self, obj)
653
654 self.memoize(obj)
--> 655 self._batch_setitems(obj.iteritems())
656
657 dispatch[DictionaryType] = save_dict

c:\python27\lib\pickle.pyc in _batch_setitems(self, items)
667 for k, v in items:
668 save(k)
--> 669 save(v)
670 write(SETITEM)
671 return

c:\python27\lib\pickle.pyc in save(self, obj)
304 reduce = getattr(obj, "__reduce_ex__", None)
305 if reduce:
--> 306 rv = reduce(self.proto)
307 else:
308 reduce = getattr(obj, "__reduce__", None)

c:\python27\lib\copy_reg.pyc in _reduce_ex(self, proto)
68 else:
69 if base is self.__class__:
---> 70 raise TypeError, "can't pickle %s objects" % base.__name__
71 state = base(self)
72 args = (self.__class__, base, state)

TypeError: can't pickle _Element objects
4029 次点击
所在节点    Python
10 条回复
Yinz
2016-08-30 23:54:33 +08:00
StackOverflow 里找到说是 libxml 是 C 写的库, pickle 库可能不支持里面的部分对象
http://stackoverflow.com/questions/8274438/saving-an-lxml-etree-elementtree-object
aihimmel
2016-08-30 23:58:31 +08:00
@Yinz 这里面有 lxml 的对象?
Yinz
2016-08-31 00:03:49 +08:00
@aihimmel 既然报错回显里面说有 _Element 对象,那么具体出了什么问题就需要你自己排查了:D
aihimmel
2016-08-31 00:22:43 +08:00
@Yinz 好吧。。话说最上面我把这个 dict 输出了你看到了吗?
RTNelo
2016-08-31 00:29:06 +08:00
@aihimmel 我这测试是没有问题的。要不要使用 iPython 的 pdb 功能输出一下 proto 看看具体是哪个元素出问题了?
aihimmel
2016-08-31 00:35:31 +08:00
@RTNelo 谢谢,我明天试试。。
wevsty
2016-08-31 00:38:26 +08:00
代码是不是使用了 multiprocessing ?
aihimmel
2016-08-31 00:51:48 +08:00
@wevsty 单线程的
kkzxak47
2016-08-31 12:13:12 +08:00
一个字典,报的错却是_Element ,你不觉得奇怪?
aihimmel
2016-08-31 14:00:46 +08:00
@kkzxak47 就是觉得奇怪。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/302794

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX