write - savefig python path
保存和加載對象並使用pickle (5)
以下為我工作:
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
我正在嘗試使用pickle
模塊保存和加載對象。
首先,我聲明我的對象:
>>> class Fruits:pass
...
>>> banana = Fruits()
>>> banana.color = 'yellow'
>>> banana.value = 30
之後我打開一個名為'Fruits.obj'的文件(之前我創建了一個新的.txt文件,我重命名為'Fruits.obj'):
>>> import pickle
>>> filehandler = open(b"Fruits.obj","wb")
>>> pickle.dump(banana,filehandler)
執行此操作後,我關閉了我的會話,然後我開始了新的會話,然後我將下一個(嘗試訪問它應該保存的對象):
file = open("Fruits.obj",'r')
object_file = pickle.load(file)
但我有這樣的信息:
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
我不知道該怎麼辦,因為我不明白這個消息。 有誰知道如何加載我的對象'香蕉'? 謝謝!
編輯:因為你們有些人已經吸了我說:
>>> import pickle
>>> file = open("Fruits.obj",'rb')
沒有問題,但我接下來的是:
>>> object_file = pickle.load(file)
我有錯誤:
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
你忘了把它讀作二進製文件。
在你的寫作部分你有:
open(b"Fruits.obj","wb") # Note the wb part (Write Binary)
在閱讀部分中,您有:
file = open("Fruits.obj",'r') # Note the r part, there should be a b too
所以用以下代替:
file = open("Fruits.obj",'rb')
它會工作:)
至於你的第二個錯誤,很可能是因為沒有正確關閉/同步文件。
試試這段代碼來寫:
>>> import pickle
>>> filehandler = open(b"Fruits.obj","wb")
>>> pickle.dump(banana,filehandler)
>>> filehandler.close()
這(未更改)閱讀:
>>> import pickle
>>> file = open("Fruits.obj",'rb')
>>> object_file = pickle.load(file)
更整潔的版本將使用with
語句。
寫作:
>>> import pickle
>>> with open('Fruits.obj', 'wb') as fp:
>>> pickle.dump(banana, fp)
閱讀:
>>> import pickle
>>> with open('Fruits.obj', 'rb') as fp:
>>> banana = pickle.load(fp)
您可以使用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
Anycache在第一次調用myfunc
,並使用唯一標識符(取決於函數名和參數)將結果pickle到cachedir
的文件作為文件名。 在任何連續運行中,將加載pickle對象。
如果在python運行之間保留cachedir
,那麼pickle對象將從之前的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
您沒有以二進制模式打開文件。
open("Fruits.obj",'rb')
應該管用。
對於您的第二個錯誤,該文件很可能是空的,這意味著您無意中將其清空或使用了錯誤的文件名或其他內容。
(假設您確實關閉了會話。如果沒有,那就是因為您沒有在寫入和讀取之間關閉文件)。
我測試了你的代碼,它的工作原理。
至於你的第二個問題:
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
讀完文件內容後,文件指針將位於文件末尾 - 將無法讀取更多數據。 您必須回放文件,以便再次從頭開始讀取:
file.seek(0)
您通常想要做的是使用上下文管理器打開文件並從中讀取數據。 這樣,在塊完成執行後,文件將自動關閉,這也有助於您將文件操作組織成有意義的塊。
最後,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}