某天在用shelve的時候出錯了,錯誤顯示:
EOFError: Ran out of input
這個......
看上去從錯誤信息里看不出什么,
但是把文件刪掉,居然又好了!
又查了下日志:在出這個錯之前,數據庫讀寫程序出了錯,導致數據庫文件被flush,大小變為0B。
似乎問題就出在這。
其實經過深究,這個問題有如下幾種可能原因:
- 讀完了啊喂!
示例源碼:
with open("test.txt","rb") as f:
print(f.read())
print(f.read()) #EOFError!
原因:當文件是一個以bytes模式打開的時候,文件指針讀到最后時並不會像讀普通文本一樣返回空,而是拋出這個錯誤。
解決:添加f.seek(0)
改進后示例源碼:
with open("test.txt","rb") as f:
print(f.read())
f.seek(0) #Move the point!
print(f.read()) #Now there are no errors!
- 模式有問題啊喂!
示例源碼:
with open("test.txt","rb") as f:
f.write(b"HELLO!") #EOFError on sometimes!
原因:同樣是bytes模式不完善,導致有時以rb模式打開並強制進行不符合模式的操作時會拋出此錯誤。
解決:把模式改成合適的東東。實例中可以改為rb+
或wb+
,注意它們的區別
改進后示例源碼:
with open("test.txt","rb+") as f:
f.write(b"HELLO!") #Now there are no errors!
完!
- 開發日記 No.1 & 本人第一篇博客