Pet*_*one 91 python object pickle
我正在尝试使用pickle模块保存和加载对象.
首先,我声明我的对象:
>>> class Fruits:pass
...
>>> banana = Fruits()
>>> banana.color = 'yellow'
>>> banana.value = 30
Run Code Online (Sandbox Code Playgroud)
之后我打开一个名为'Fruits.obj'的文件(之前我创建了一个新的.txt文件,我重命名为'Fruits.obj'):
>>> import pickle
>>> filehandler = open(b"Fruits.obj","wb")
>>> pickle.dump(banana,filehandler)
Run Code Online (Sandbox Code Playgroud)
执行此操作后,我关闭了会话,然后我开始了一个新的会话,然后我将下一个(尝试访问它应该保存的对象):
file = open("Fruits.obj",'r')
object_file = pickle.load(file)
Run Code Online (Sandbox Code Playgroud)
但我有这样的信息:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python31\lib\pickle.py", line 1365, in load
encoding=encoding, errors=errors).load()
ValueError: read() from the underlying stream did notreturn bytes
Run Code Online (Sandbox Code Playgroud)
我不知道该怎么办,因为我不明白这个消息.有谁知道如何加载我的对象'香蕉'?谢谢!
编辑: 因为你们有些人已经吮吸我放:
>>> import pickle
>>> file = open("Fruits.obj",'rb')
Run Code Online (Sandbox Code Playgroud)
没有问题,但我接下来的是:
>>> object_file = pickle.load(file)
Run Code Online (Sandbox Code Playgroud)
我有错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python31\lib\pickle.py", line 1365, in load
encoding=encoding, errors=errors).load()
EOFError
Run Code Online (Sandbox Code Playgroud)
Jim*_*som 63
至于你的第二个问题:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python31\lib\pickle.py", line
1365, in load encoding=encoding,
errors=errors).load() EOFError
Run Code Online (Sandbox Code Playgroud)
读完文件内容后,文件指针将位于文件的末尾 - 将无法读取更多数据.您必须回放文件,以便再次从头开始读取:
file.seek(0)
Run Code Online (Sandbox Code Playgroud)
您通常想要做的是使用上下文管理器打开文件并从中读取数据.这样,文件将在块完成执行后自动关闭,这也将帮助您将文件操作组织成有意义的块.
最后,cPickle是C中pickle模块的更快实现.所以:
In [1]: import cPickle
In [2]: d = {"a": 1, "b": 2}
In [4]: with open(r"someobject.pickle", "wb") as output_file:
...: cPickle.dump(d, output_file)
...:
# pickle_file will be closed at this point, preventing your from accessing it any further
In [5]: with open(r"someobject.pickle", "rb") as input_file:
...: e = cPickle.load(input_file)
...:
In [7]: print e
------> print(e)
{'a': 1, 'b': 2}
Run Code Online (Sandbox Code Playgroud)
mar*_*eau 34
以下适用于我:
class Fruits: pass
banana = Fruits()
banana.color = 'yellow'
banana.value = 30
import pickle
filehandler = open("Fruits.obj","wb")
pickle.dump(banana,filehandler)
filehandler.close()
file = open("Fruits.obj",'rb')
object_file = pickle.load(file)
file.close()
print(object_file.color, object_file.value, sep=', ')
# yellow, 30
Run Code Online (Sandbox Code Playgroud)
Wol*_*lph 18
你忘了把它读成二进制文件.
在你的写作部分,你有:
open(b"Fruits.obj","wb") # Note the wb part (Write Binary)
Run Code Online (Sandbox Code Playgroud)
在阅读部分中,您有:
file = open("Fruits.obj",'r') # Note the r part, there should be a b too
Run Code Online (Sandbox Code Playgroud)
所以用以下代替:
file = open("Fruits.obj",'rb')
Run Code Online (Sandbox Code Playgroud)
它会工作:)
至于你的第二个错误,很可能是因为没有正确关闭/同步文件.
试试这段代码来写:
>>> import pickle
>>> filehandler = open(b"Fruits.obj","wb")
>>> pickle.dump(banana,filehandler)
>>> filehandler.close()
Run Code Online (Sandbox Code Playgroud)
这(未更改)阅读:
>>> import pickle
>>> file = open("Fruits.obj",'rb')
>>> object_file = pickle.load(file)
Run Code Online (Sandbox Code Playgroud)
一个更整洁的版本将使用该with声明.
写作:
>>> import pickle
>>> with open('Fruits.obj', 'wb') as fp:
>>> pickle.dump(banana, fp)
Run Code Online (Sandbox Code Playgroud)
阅读:
>>> import pickle
>>> with open('Fruits.obj', 'rb') as fp:
>>> banana = pickle.load(fp)
Run Code Online (Sandbox Code Playgroud)
ism*_*ail 13
在这种情况下,始终以二进制模式打开
file = open("Fruits.obj",'rb')
Run Code Online (Sandbox Code Playgroud)
您可以使用anycache为您完成这项工作。假设您有一个myfunc创建实例的函数:
from anycache import anycache
class Fruits:pass
@anycache(cachedir='/path/to/your/cache')
def myfunc()
banana = Fruits()
banana.color = 'yellow'
banana.value = 30
return banana
Run Code Online (Sandbox Code Playgroud)
Anycachemyfunc在第一次调用并将结果腌制到文件中,cachedir使用唯一标识符(取决于函数名和参数)作为文件名。在任何连续运行中,都会加载腌制对象。
如果cachedir在 python 运行之间保留了 ,pickled 对象将从之前的 python 运行中获取。
函数参数也被考虑在内。重构的实现同样有效:
from anycache import anycache
class Fruits:pass
@anycache(cachedir='/path/to/your/cache')
def myfunc(color, value)
fruit = Fruits()
fruit.color = color
fruit.value = value
return fruit
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
250993 次 |
| 最近记录: |