web-dev-qa-db-ja.com

ファイルに書き込む前に(Pythonで)ファイルの内容を削除しますか?

私は このrosalindの問題 を試していて、問題が発生しています。コードのすべてが正しいと思いますが、意図したとおりに実行されていないため、明らかにそうではありません。ファイルの内容を削除してから、そのファイルにテキストを書き込みます。プログラムは希望するテキストを書き込みますが、最初の内容を最初に削除しません。

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)

私は見た:

python script? で書き込む前にファイルの内容を削除する方法

しかし、私の問題はまだ続きます。何が悪いのですか?

6
Tare Gaskin

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)を渡すこともできますが、これによりポインタ(つまり、今後の書き込みの場所)がファイルの先頭以外の場所に残り、起動時にファイルがまばらになります。その位置に書き込みます)。

16
Charles Duffy

ファイル内の古いデータを完全に上書きする場合は、別の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モードを使用してファイルを開きます。これにより、ファイルにテキストを追加せず、データのみを書き込むことができます。

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

5
Ofer Arial