2016-02-28 60 views
3

我一直在嘗試讀取文件,然後用一些更新的數據覆蓋它。 我試着做這樣的:讀取文件,然後用Python覆蓋它

#Created filename.txt with some data 
with open('filename.txt', 'r+') as f: 
    data = f.read() 
    new_data = process(data) # data is being changed 
    f.seek(0) 
    f.write(new_data) 

出於某種原因,它不會覆蓋該文件,它的內容保持不變。

+1

你能詳細說明什麼不起作用嗎? –

+0

它是否讀取文件,但不寫入,或根本沒有? – Menasheh

+0

'w +'截斷了一個文件,所以在'f.read()'中它總是空的。 'a +'也會創建文件,但是在閱讀之前您需要尋找開始。 – AChampion

回答

3

找到前端後截斷文件。這將刪除所有的現有數據。

>>> open('deleteme', 'w').write('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa') 
>>> f = open('deleteme', 'r+') 
>>> f.read() 
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 
>>> f.seek(0) 
>>> f.truncate() 
>>> f.write('bbb') 
>>> f.close() 
>>> open('deleteme').read() 
'bbb' 
>>> 
+0

它仍然不起作用。我在循環中使用代碼,每次從文件中讀取的數據都是我在循環開始之前給它的原始數據 - 它不覆蓋文件... – pystudent

+0

然後,我們可能必須責怪你的其他代碼。例如,'process'只是返回相同的數據? (你可以添加'assert data!= new_data'來調試,也許你正在編寫一個不同於你想象的文件,用'os.path.abspath'打印你實際使用的文件 – tdelaney

+0

謝謝你的回答,正如你所建議的那樣,我在代碼中的另一個地方發現了這個問題。 – pystudent

0

您應該在seek之後添加truncate的電話,建議使用tdelaney

嘗試在不同範圍內讀寫,代碼更加清晰,數據處理在文件處理程序打開時不會完成。

data = '' 
with open('filename.txt', 'r') as f: 
    data = f.read() 

new_data = process(data) 
with open('filename.txt', 'w+') as f: 
    f.write(new_data) 
+0

你是完全正確的,我已經改變了一下我的代碼,但它仍然不起作用。 – pystudent