2009-09-25 168 views
2

撤消寫入文件的最佳方法是什麼?如果我正在經歷一個循環並一次寫一行,並且我想撤消之前的寫作並將其替換爲其他內容,那麼我該怎麼做呢?有任何想法嗎?Python:撤消寫入文件

在此先感謝!

+1

你爲什麼要這樣做?你能給一個背景環境嗎? – 2009-09-25 19:08:14

+2

「嗨,我只是在腳下開槍自殺,治療這種疼痛最好的方法是什麼?」回答?不要將自己踢在腳下!除非您知道這是您想要做的事,否則不要將該行寫出到文件中。 – 2009-09-25 19:14:53

+0

@Sridhar Ratnakumar:我有大量的數據解析來生成一個文件,每行都有相關信息。但是,如果給定的行包含與前一行相同的信息,則需要以不同的格式寫入。鑑於源數據非常龐大,我想逐行處理它。這有意義嗎? – aspade 2009-09-25 19:18:21

回答

4

嘗試寫入您的文件lazily:不要寫,直到你終於確定你需要做到這一點。

+0

是的,那是一種選擇,但我正在處理大量數據,我寧願將它的一小部分保留在內存中,直到它被刷新。 – aspade 2009-09-25 19:10:22

+0

在這種情況下,小子集是您等待寫入的*一行*。 – 2009-09-25 20:22:46

+0

會愛上!!!這是我想要做的方式,不幸的是我有一個來自subprocess.Popen調用的數據集合,因此我必須將其直接傳遞給文件。 – gunslingor 2018-01-09 18:33:18

0

如果保留行號的軌道,你可以使用這樣的事情:

from itertools import islice 
def seek_to_line(f, n): 
    for ignored_line in islice(f, n - 1): 
     pass # skip n-1 lines 


f = open('foo') 
seek_to_line(f, 9000) # seek to line 9000 


# print lines 9000 and later 
for line in f: 
    print line 
+0

@ennuikiller:我也這麼想,但我不太確定這是否是最好的方法。我想有時候你必須做一些有用的事情,而不必擔心什麼是幻想。 – aspade 2009-09-25 19:13:43

0

也許是更好的事情是修改程序,使其只寫一行,如果你確定你想寫它。要做到這一點你的代碼看起來是這樣的:

to_write = "" 
for item in alist: 
    #Check to make sure that I want to write 
    f.write(to_write) 
    to_write = "" 
    #Compute what you want to write. 
    to_write = something 

#We're finished looping so write the last part out 
f.write(to_write) 
5

正如其他人指出,這並沒有太大的意義,它是最好不要寫,直到你不得不這樣做。在你的情況下,你可以將「寫指針」保留在處理的後面一行。

僞代碼:

previousItem = INVALID 
for each item I: 
    is I same as previousItem? 
    then update previousItem with I 
    else 
     write previousItem to file 
     previousItem = I 
write previousItem to file 

,你可以看到,previousItem是唯一的項目保存在內存中,並且它的更新會根據需要「收集」。它只是寫入文件,當下一個不是「一樣」那一個。

當然,您可以真正回滾文件光標,只記錄最後一行開始處的字節偏移量,然後在重寫之前執行fseek()。起初編寫起來似乎更簡單,但調試卻是一場完全的噩夢。

4

如上所述,您最好不要試圖撤消寫入。如果你真的想這樣做,但是,它很容易做到:

import os 
f = open("test.txt", "w+") 
f.write("testing 1\n") 
f.write("testing 2\n") 
pos = f.tell() 
f.write("testing 3\n") 

f.seek(pos, os.SEEK_SET) 
f.truncate(pos) 
f.write("foo\n") 

只是記錄文件位置後退到,尋求回它,並截斷該文件到該位置。

這樣做的主要問題是它不適用於流。你不能這樣做stdout,或者到管道或TCP流;只有一個真實的文件。