Pythonでテキストファイルの内容を消去する方法


140

Pythonで消去したいテキストファイルがあります。それ、どうやったら出来るの?


答えを与えた人々はそれは不可能だと言っています...それであなたはPythonでそれを簡単に行う方法を私に教えたいですか?
Hick

回答:


279

Pythonでは:

open('file.txt', 'w').close()

または、既に開いているファイルがある場合:

f = open('file.txt', 'r+')
f.truncate(0) # need '0' when using r+

C ++では、同様のものが使用できます。


#include<fstream>そしてstd::ofstream("file.txt");Pythonと同じくらい短い。:)
ヴィルヘルムテル

8
これが機能する理由(C ++とpythonの両方)は、デフォルトで書き込み用にファイルを開くと、既存の内容が切り捨てられるためです。ですから、それは実際には副作用であり、不要であっても、明確にするためにtruncate()を明示的に呼び出すことをお勧めします。
rmeador

7
「r +」を使用してファイルを開いた場合、ファイルを解析したことがあれば、truncate(0)を使用します。これを上記の回答に追加して完成させてください!
Johan Engblom 2017

3
f.seek(0)を使用して、ポインターをファイルの先頭に移動します
Johan Engblom

ファイルの読み取りと書き込みを行っていました。答えはファイルを完全に切り捨てますが、何かを再度書き込む場合は、のf.seek(0)後に追加することを忘れないでください。そうしないf.truncate(0)と、ファイルの先頭に奇妙な\ x00が追加されます。
クリシュナチャイタンヤ

29

完全な答えではなく、オンドラの答えの拡張

truncate()(私の推奨する方法)を使用するときは、カーソルが必要な位置にあることを確認してください。新しいファイルが読み取り用に開かれたとき- open('FILE_NAME','r')そのカーソルはデフォルトで0にあります。ただし、コード内でファイルを解析した場合は、ファイルの先頭を再度ポイントするようにしてください。つまり、truncate(0) デフォルトtruncate()では、ファイルの内容を現在のカーソル位置から切り捨てます。

簡単な例


21

「書き込み」モードでファイルを開くと、そのファイルはクリアされます。特に書き込む必要はありません。

open("filename", "w").close()

(ファイルが自動的に閉じられるタイミングは実装固有である可能性があるため、閉じる必要があります)



8

を使用with open("myfile.txt", "r+") as my_file:するとmyfile.txt、特に最初にファイルを読み込んでいるため、で奇妙なゼロが表示されます。これが機能するためにはmy_file、最初にでファイルの先頭へのポインタを変更する必要がありましたmy_file.seek(0)。次にmy_file.truncate()、ファイルをクリアすることができます。


1
これは当然のことですが、3年前にこの回答で言及されました。
AMC

6

ファイルを上書きする必要があります。C ++の場合:

#include <fstream>

std::ofstream("test.txt", std::ios::out).close();

1
close()通話の必要はありません。デストラクタはファイルを閉じます。:ただ一時的に作成する必要がありますのでofstream("test.txt");
wilhelmtell

この質問は、この回答以降変更されました。質問の新しい方向性を考慮して、質問を削除しますか?
Seanny123

1

プログラム内でファイルポインターをnullに割り当てると、そのファイルへの参照が削除されます。ファイルはまだ残っています。remove()C の関数stdio.hはあなたが探しているものだと思います。Pythonについてはわかりません。


2
ところで、remove()とunlink()はどちらも、実際にファイルを消去するのではなく、通常のファイルの参照カウントを減らします。参照カウントがゼロになると、ファイルは消去されます。たとえば、プロセスでファイルが開かれていて、そのファイルに対してunlink()またはremove()を呼び出した場合、ファイルがclose()dになるまで削除されません(つまり、参照カウントが0に下がる-他のプロセスも想定していない)ファイルを開いておきます)。この動作は、たとえば、プロセスの異常終了(たとえば、open()、unlink()、perform file IO、CRASH、close()が呼び出されない)後に一時ファイルが残されないようにするのに役立ちます。
2010年

1

セキュリティが重要な場合は、書き込みのためにファイルを開いて再度閉じるだけでは不十分です。少なくとも一部の情報はまだストレージデバイスにあり、たとえば、ディスク回復ユーティリティを使用して見つけることができます。

たとえば、消去しているファイルに本番パスワードが含まれていて、現在の操作が完了したらすぐに削除する必要があるとします。

使い終わったファイルをゼロで埋めることで、機密情報が確実に破壊されます。

最近のプロジェクトでは、次のコードを使用しました。これは、小さなテキストファイルに適しています。既存の内容をゼロの行で上書きします。

import os

def destroy_password_file(password_filename):
    with open(password_filename) as password_file:
        text = password_file.read()
    lentext = len(text)
    zero_fill_line_length = 40
    zero_fill = ['0' * zero_fill_line_length
                      for _
                      in range(lentext // zero_fill_line_length + 1)]
    zero_fill = os.linesep.join(zero_fill)
    with open(password_filename, 'w') as password_file:
        password_file.write(zero_fill)

ゼロフィリングはセキュリティを保証するものではないことに注意してください。本当に心配な場合は、ゼロフィルを行い、ファイルシュレッダーCCleanerなどの専門ユーティリティ使用して、ドライブの「空の」スペースをワイプしてクリーンにするのが最善です。


0

末尾を消去する必要がない限り、ファイルからインプレースで「消去」することはできません。「空」の値が上書きされたコンテンツであるか、必要なファイルの部分を読み取って別のファイルに書き込みます。


ガベージバリューを指定せずに上書きするにはどうすればよいですか。文字列長9があり、文字列長6で上書きしていると仮定します。それは3つのガベージ値rtを意味するでしょうか?
Hick

正しい。さらに、これらの3つの文字がゴミであるという事実を読者に示す何らかの方法が必要です。
Ignacio Vazquez-Abrams

実際のところ、私のコードはpythonとc ++にまたがっています。ファイルの読み込みは、C ++で、ファイルの書き込みpythonで行われます。..両方のファイルが持っている時間を消去するので、場合...
ヒック

0

テキストファイルはシーケンシャルなので、それらのデータを直接消去することはできません。オプションは次のとおりです。

  • 最も一般的な方法は、新しいファイルを作成することです。元のファイルから読み取り、消去する部分を除いて、すべてを新しいファイルに書き込みます。すべてのファイルが書き込まれたら、古いファイルを削除し、新しいファイルの名前を元の名前に変更します。
  • また、変更したい時点からファイル全体を切り詰めて書き換えることもできます。変更したい場所を探し、残りのファイルをメモリに読み込みます。同じポイントに戻り、ファイルを切り捨てて、消去したい部分を除いて内容を書き戻します。
  • 別の簡単なオプションは、同じ長さの別のデータでデータを上書きすることです。そのためには、正確な位置を探し、新しいデータを書き込みます。制限は、正確に同じ長さでなければならないということです。

seek/ truncatefunction / methodを見て、上記のアイデアを実装してください。PythonとCの両方にこれらの関数があります。


最初からファイル全体を消去したい
Hick

2
次に、ファイルを削除します。os.removeまたはos.unlinkPythonで、またはunlinkC で使用します。別のオプションは、書き込みまたは使用のためにファイルを再度開くことですtruncate
nosklo

0

ファイルコンテンツの書き込みと読み取り

def writeTempFile(text = ''):
    filePath = "/temp/file1.txt"
    if not text:                      # If blank return file content
        f = open(filePath, "r")
        slug = f.read()
        return slug
    else:
        f = open(filePath, "a") # Create a blank file
        f.seek(0)  # sets  point at the beginning of the file
        f.truncate()  # Clear previous content
        f.write(text) # Write file
        f.close() # Close file
        return text

それは私のために働いた


0

これを使用することもできます(上記の回答のいくつかに基づく):

file = open('filename.txt', 'w')
file.write('')
file.close

もちろん、これは非常に多くのコード行を必要とするため、ファイルをクリアするのに非常に悪い方法ですが、この方法でも実行できることを示すためにこれを書いただけです。

幸せなコーディング!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.