2017-09-22 47 views
0

我的代碼有問題,在這種情況下,unpickling每次都會導致「Ran out of input」錯誤。爲了測試這個,我在命令提示符下運行了一個小東西pickle「用完輸入」在一個文件上醃製

Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 17:54:52) [MSC v.1900 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import pickle 
>>> with open('C:/Users/Administrator/Desktop/testing/playerlist.txt', 'wb') as f: 
...  pickle.dump({"foo": "bar"}, f) 
... 
>>> with open('C:/Users/Administrator/Desktop/testing/playerlist.txt', 'rb') as f: 
...  print(f.read()) 
...  print(pickle.loads(f.read())) 
... 
b'\x80\x03}q\x00X\x03\x00\x00\x00fooq\x01X\x03\x00\x00\x00barq\x02s.' 
Traceback (most recent call last): 
    File "<stdin>", line 3, in <module> 
EOFError: Ran out of input 
>>> 

這段代碼之前爲我工作,但突然沒有。我誤解了一些鹹菜嗎?

回答

2
print(f.read()) 

已經讀完所有輸入,這意味着文件指針位於文件末尾。所以,當你以後做,

print(pickle.loads(f.read())) 

指針讀取沒有什麼可留。

您可以刪除第一個print(f.read())或在print(f.read())後面添加f.seek(0)將文件指針移至文件的開頭。


旁註:

就像pickle.dump(dict, f)你也可以使用pickle.load(f)直接從文件對象加載該文件,而無需使用pickle.loads(f.read())

0

f.read()當您在print()中調用文件迭代器時耗盡了文件迭代器,因此在pickle.loads()中再次調用它時沒有數據。您需要使用f.seek(0)快退指針,或者將其捕獲到您用於打印和加載的變量中。

相關問題