2012-09-12 64 views
3

我是新來的Python 我要檢查,如果文件名checkzero.txt存在 如果不存在的話,我想在checkzero.txt寫1,否則我會增加它。Python的檢查,如果是更新否則創建它

if os.path.exists("checkzero.txt"): 

    f = open('checkzero.txt', 'r') 
    counter = pickle.load(f) 
    f.close() 

    counter = counter + 1 

    f = open('checkzero.txt', 'w') 
    pickle.dump(counter, f) 
    f.close() 

else: 
    f = open('checkzero.txt', 'w') 
    pickle.dump(1, f) 
    f.close() 

但是如果我創建checkzero.txt作爲一個空文件,它的錯誤與:

Traceback (most recent call last): 
    File "FileBasics.py", line 8, in <module> 
    counter = pickle.load(f) 
    File "/usr/local/Cellar/python/2.7.2/lib/python2.7/pickle.py", line 1378, in load 
    return Unpickler(file).load() 
    File "/usr/local/Cellar/python/2.7.2/lib/python2.7/pickle.py", line 858, in load 
    dispatch[key](self) 
    File "/usr/local/Cellar/python/2.7.2/lib/python2.7/pickle.py", line 880, in load_eof 
    raise EOFError 
EOFError 
+0

如果它不存在,我想在checkzero.txt中創建並寫入1,否則我會增加它。 – VeilEclipse

+0

這應該工作正常......雖然它更好的形式來使用與開放(文件名)爲f:'那麼你是如何做到這一點 –

+0

這應該工作得很好。什麼是問題? –

回答

4

您需要在二進制模式下打開pickle文件:

f = open('checkzero.txt', 'rb') 

f = open('checkzero.txt', 'wb') 

但爲什麼要使用pickle呢?

你可以得到相同的結果是這樣的:

try: 
    with open("checkzero.txt") as f: 
     counter = int(f.read()) +1 
except IOError: 
    counter = 1 
with open("checkzero.txt", "w") as f: 
    f.write(str(counter)) 
+0

感謝你的提示。我試着像你一樣,但我得到相同的錯誤 – VeilEclipse

+0

而你沒有文件開始? – Matthias

+0

是的,我必須開始沒有文件。這就是爲什麼我寫了ELSE部分 – VeilEclipse

2

的代碼看起來工作正常,但我得到您在您的評論顯示,如果該文件最初存在,但是是空的錯誤。確保該文件在第一次運行代碼時尚未存在。

+0

在這裏是一樣的,但如果文件存在,我想增加內容然後保存它 – VeilEclipse

+0

爲了讓pickle.load()工作,必須使用pickle.dump()創建文件,如果文件爲空,它不是用pickle.dump()創建的,它沒有除了這個代碼之外,還有別的東西會創建文件嗎?如果是這樣,它必須使用pickle.dump()和一些初始整數值。 –

+0

另外,如果使用pickle不是必需的,我會選擇類似Tim Pietzcker的純文本解決方案 –

3

這個更pythonic的方式呢?

try: 
    with open('checkzero.txt', 'rb')as f: 
     counter = pickle.load(f) + 1 
except IOError: 
    counter = 1 

with open('checkzero.txt', 'wb') as f: 
    pickle.dump(counter, f) 

嘗試打開文件進行閱讀。如果不存在,則設置默認值。

編輯:蒂姆回答了我的工作時,我的答案。當然他是對的。爲什麼要使用泡菜?

+0

非常感謝您的幫助,但是我收到錯誤「Traceback(最近調用最後一個)」: 文件「/Users/manabchetia/Documents/Codes/FileBasics.py」,第23行,在 counter = pickle.load(f)+ 1 文件「/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py」,第1378行,載入中 return Unpickler(文件).load() 文件「/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py」,第858行,載入中 dispatch [key](self) File「/ Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py「,第880行,load_eof raise EOFError EOFError' – VeilEclipse

+0

THanks a lot @Matthias – VeilEclipse

相關問題