ファイルへの書き込みを元に戻す最良の方法は何ですか? ループを通過して一度に 1 行ずつ書き込んでいて、前の書き込みを元に戻して別のものに置き換えたい場合、どうすればよいでしょうか? 何か案は?
前もって感謝します!
他の人が指摘しているように、これはあまり意味がありません。必要になるまで書かない方がはるかに良いです。あなたの場合、「書き込みポインター」を処理の1行後ろに置くことができます。
疑似コード:
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()
書き換える前にそこに移動します。最初はコーディングが簡単に見えるかもしれませんが、デバッグするのは完全に悪夢です。
前述のように、書き込みを元に戻そうとしないのが最善です。ただし、本当にやりたい場合は、簡単です。
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")
巻き戻し先のファイル位置を記録し、そこに戻ってシークし、その位置までファイルを切り捨てます。
これを行う際の主な問題は、ストリームでは機能しないことです。これを標準出力、パイプ、または TCP ストリームに対して行うことはできません。実ファイルのみ。
ファイルへの書き込みは怠惰に行うようにしてください: 最終的にそれを行う必要があると確信するまで、書き込みを行わないでください。
行番号を追跡する場合は、次のようなものを使用できます。
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
おそらく、行を書きたいと確信している場合にのみ行を書き込むように、プログラムを変更することをお勧めします。これを行うには、コードは次のようになります。
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)