あなたのアプローチの問題は、入力ストリームと出力ストリームの両方が必要であることです。入力ストリームと出力ストリームは、同じファイル内の別の場所を指すことができます。 f.seek()
を使用する場合は、それぞれの読み取りと書き込みの後にf.tell()
を使用して位置を保存する必要があります。例:
f = open(filename, 'r+')
while True:
i = f.readline()
if i == '': break
in = f.tell()
f.seek(out)
f.write(i.rstrip()+"\n")
out = f.tell()
f.seek(in)
これは混乱しやすく、エラーが発生する可能性があります。ファイルが大きすぎない場合は、すべてをメモリに読み込んでから、再度書き戻してみてください。
in = open(filename, 'r')
lines = in.read()
in.close()
out = open(filename, 'w')
out.write([line.rstrip()+'\n' for line in lines.split('\n')])
out.close()
ファイルは、一時ファイルに行を書き込み、その後、作業が完了したときにファイル名を変更し、メモリに収まる大きすぎる場合:
out = open(filename+'.tmp', 'w')
with open(filename, 'r') as f:
for i in f:
out.write(i.rstrip()+"\n")
out.close()
os.rename(filename+'.tmp', filename)
いい例と素晴らしい説明。 – misguided
ありがとうございます。メモリが利用可能であっても一時ファイルを使用するのが好きです。また、一時ファイルdocs内のスプールされた一時ファイルをチェックしてください。これは面白い妥協点を示しています。 – JonnyRo