2017-01-28 10 views
3

私はthis rosalind problemに手をかけていますが、問題が発生しています。私は自分のコード内のすべてが正しいと信じていますが、明らかに意図したとおりに動作していないわけではありません。私は、ファイルの内容を削除し、そのファイルにいくつかのテキストを書いてみたい。プログラムは、私が望むテキストを書きますが、最初の内容は削除しません。ファイルの内容を削除してから(Pythonで)削除しますか?

def ini5(file): 
raw = open(file, "r+") 
raw2 = (raw.read()).split("\n") 
clean = raw2[1::2] 
raw.truncate() 
for line in clean: 
    raw.write(line) 
    print(line) 

私が見てきた:

How to delete the contents of a file before writing into it in a python script?

しかし、私の問題は解決しません。私は間違って何をしていますか?

+0

これは良い例ではありません。出力用に別の一時ファイルを作成し、完了したら元のファイルに名前を変更する方がよい場合があります。つまり、プログラムが完了しなかった場合に入力ファイルを破壊することなく、同時に実行されているシステム上の他のプロセスが元のバージョンまたは更新されたフォームのいずれかのバージョンにいつでもアクセスできます。 –

答えて

6

truncate()で切り捨て現在の位置。そのドキュメントごとに、重点が追加:(サイズが指定されない場合、または現在位置)

バイトに所定の大きさにストリームのサイズを変更

read()の後、現在の位置がファイルの末尾になります。同じファイルハンドルを切り詰めて書き換えたい場合は、最初に戻るにはseek(0)を実行する必要があります。したがって

raw = open(file, "r+") 
contents = raw.read().split("\n") 
raw.seek(0)      # <- This is the missing piece 
raw.truncate() 
raw.write('New contents\n') 

(あなたはまた、raw.truncate(0)に合格している可能性があり、これはポインタを残しているだろう - ので、将来のための場所が書き込み - ファイルの先頭以外の位置に、あなたがその位置に書き始めたときにあなたのファイルを疎にする)。

3

ファイル内の古いデータを完全に上書きする場合は、別のファイルmodeを使用してファイルを開く必要があります。

それは次のようになります。

raw = open(file, "w") # or "wb" 

あなたの問題を解決するには、まずファイルの内容をお読みください。

with open(file, "r") as f: # or "rb" 
    file_data = f.read() 
# And then: 
raw = open(file, "w") 

そしてwrite mode.Thisの方法を使用してそれを開く、あなたを追加しません。テキストをファイルに書き込むだけで、データだけを書き込むことができます。

モードファイルhereについて読む。

+0

OPは上書きの前に読み込みを実行したい - そうでなければ、それらは 'w'を使っただけですが、その目的には適していません。読み込みハンドルを閉じてから2番目の書き込みハンドルを作成することを提案している場合は、それは実行可能ですが、もっと明示的になるかもしれません。 –

+0

あなたが正しいです、私はそれを追加しました。簡単にするために –

+1

upvote。私はそれを避けることができれば、読み取り/書き込み用のハンドルを開かないようにします。私は同じハンドルを再利用する方が早いと思う。 –

関連する問題