3

ファイルへの書き込みを元に戻す最良の方法は何ですか? ループを通過して一度に 1 行ずつ書き込んでいて、前の書き込みを元に戻して別のものに置き換えたい場合、どうすればよいでしょうか? 何か案は?

前もって感謝します!

4

5 に答える 5

5

他の人が指摘しているように、これはあまり意味がありません。必要になるまで書かない方がはるかに良いです。あなたの場合、「書き込みポインター」を処理の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()書き換える前にそこに移動します。最初はコーディングが簡単に見えるかもしれませんが、デバッグするのは完全に悪夢です。

于 2009-09-25T19:41:36.707 に答える
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")

巻き戻し先のファイル位置を記録し、そこに戻ってシークし、その位置までファイルを切り捨てます。

これを行う際の主な問題は、ストリームでは機能しないことです。これを標準出力、パイプ、または TCP ストリームに対して行うことはできません。実ファイルのみ。

于 2009-09-25T20:05:55.847 に答える
4

ファイルへの書き込みは怠惰に行うようにしてください: 最終的にそれを行う必要があると確信するまで、書き込みを行わないでください。

于 2009-09-25T19:06:57.790 に答える
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 
于 2009-09-25T19:09:20.703 に答える
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)
于 2009-09-25T19:11:08.700 に答える