gpt4 book ai didi

Python pickle 调用 cPickle?

转载 作者:太空狗 更新时间:2023-10-29 18:25:11 24 4
gpt4 key购买 nike

我是 Python 新手。我正在将别人的代码从 Python 2.X 改编到 3.5。该代码通过 cPickle 加载文件。我将所有出现的“cPickle”更改为“pickle”,因为我知道 pickle 在 3.5 中取代了 cPickle。我收到此执行错误:

NameError: name 'cPickle' is not defined

相关代码:

import pickle
import gzip
...
def load_data():
f = gzip.open('../data/mnist.pkl.gz', 'rb')
training_data, validation_data, test_data = pickle.load(f, fix_imports=True)
f.close()
return (training_data, validation_data, test_data)

load_data() 被另一个函数调用时,错误发生在 pickle.load 行。但是,a) cPicklecpickle 都不再出现在项目中任何地方的任何源文件中(全局搜索)和 b) 如果我运行这些行,则不会发生错误在 Python shell 中分别在 load_data() 中(但是,我确实遇到了另一个数据格式错误)。 pickle 是否正在调用 cPickle,如果是,我该如何停止它?

外壳:Python 3.5.0 | python 2.4.0 (x86_64)| (默认,2015 年 10 月 20 日,14:39:26)[GCC 4.2.1 (Apple Inc. build 5577)] 在 Darwin 上

集成环境:IntelliJ 15.0.1、Python 3.5.0、anaconda

不清楚如何进行。任何帮助表示赞赏。谢谢。

最佳答案

实际上,如果您从 python2.x 中 pickle 了对象, 那么一般可以被 python3.x 读取.此外,如果您从 python3.x 中 pickle 了对象, 它们通常可以被 python2.x 读取, 但前提是它们被转储为 protocol设置为 2或更少。

Python 2.7.10 (default, Sep  2 2015, 17:36:25) 
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> x = [1,2,3,4,5]
>>> import math
>>> y = math.sin
>>>
>>> import pickle
>>> f = open('foo.pik', 'w')
>>> pickle.dump(x, f)
>>> pickle.dump(y, f)
>>> f.close()
>>>
dude@hilbert>$ python3.5
Python 3.5.0 (default, Sep 15 2015, 23:57:10)
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle
>>> with open('foo.pik', 'rb') as f:
... x = pickle.load(f)
... y = pickle.load(f)
...
>>> x
[1, 2, 3, 4, 5]
>>> y
<built-in function sin>

此外,如果您正在寻找 cPickle , 现在是 _pickle , 不是 pickle .

>>> import _pickle
>>> _pickle
<module '_pickle' from '/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload/_pickle.cpython-35m-darwin.so'>
>>>

你还问了如何停止pickle使用内置 (C++) 版本。您可以使用 _dump 来完成此操作和 _load ,或 _Pickler类,如果你喜欢使用类对象。使困惑?老cPickle现在是_pickle , 然而 dump , load , dumps , 和 loads都指向_pickle … 而 _dump , _load , _dumps , 和 _loads指向纯python版本。例如:

>>> import pickle
>>> # _dumps is a python function
>>> pickle._dumps
<function _dumps at 0x109c836a8>
>>> # dumps is a built-in (C++)
>>> pickle.dumps
<built-in function dumps>
>>> # the Pickler points to _pickle (C++)
>>> pickle.Pickler
<class '_pickle.Pickler'>
>>> # the _Pickler points to pickle (pure python)
>>> pickle._Pickler
<class 'pickle._Pickler'>
>>>

所以如果你不想使用内置版本,那么你可以使用pickle._loads之类的。

关于Python pickle 调用 cPickle?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33747141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com