web-dev-qa-db-ja.com

pythonのファイルのコンテンツのみを削除する方法

いくつかのコンテンツを含む一時ファイルとpythonこのファイルへの出力を生成するスクリプト。コンテンツ全体を削除するため、次のサイクルで一時ファイルは空になります。コンテンツを削除するには、次のコードを使用します。

_def deleteContent(pfile):

    pfile.seek(0)
    pfile.truncate()
    pfile.seek(0) # I believe this seek is redundant

    return pfile

tempFile=deleteContent(tempFile)
_

私の質問は、一時ファイルをディスクから実際に削除せずにコンテンツ全体を削除する他の(より良い、より短い、またはより安全な)方法はありますか?

tempFile.truncateAll()のようなものですか?

34
bartimar

Pythonでファイルのコンテンツのみを削除する方法

ファイルへのアクセス方法に応じて、ファイルの論理サイズを0に設定する方法がいくつかあります。

開いているファイルを空にするには:

def deleteContent(pfile):
    pfile.seek(0)
    pfile.truncate()

ファイル記述子がわかっている開いているファイルを空にするには:

def deleteContent(fd):
    os.ftruncate(fd, 0)
    os.lseek(fd, 0, os.SEEK_SET)

閉じられたファイル(名前がわかっているファイル)を空にするには

def deleteContent(fName):
    with open(fName, "w"):
        pass


いくつかのコンテンツを持つ一時ファイルがあります[...]必要なreuseそのファイル

そうは言っても、一般的なケースでは、おそらく一時ファイルをreuseすることは効率的でも望ましくもありません。特定のニーズがない限り、 tempfile.TemporaryFile およびcontext managerを使用して、一時ファイルをほぼ透過的に作成/使用/削除します。

import tempfile

with tempfile.TemporaryFile() as temp:
     # do whatever you want with `temp`

# <- `tempfile` guarantees the file being both closed *and* deleted
#     on exit of the context manager
72
Sylvain Leroux

最も簡単な方法は、ファイルを書き込みモードで開いてから閉じることです。たとえば、ファイルmyfile.datに含まれるもの:

"This is the original content"

その後、あなたは簡単に書くことができます:

f = open('myfile.dat', 'w')
f.close()

これにより、すべてのコンテンツが消去されます。次に、新しいコンテンツをファイルに書き込むことができます。

f = open('myfile.dat', 'w')
f.write('This is the new content!')
f.close()
5
Peaceful

あなたはこれを行うことができます:

def deleteContent(pfile):
    fn=pfile.name 
    pfile.close()
    return open(fn,'w')
2
the wolf

このようなものよりも簡単なものは何ですか:

import tempfile

for i in range(400):
    with tempfile.TemporaryFile() as tf:
        for j in range(1000):
            tf.write('Line {} of file {}'.format(j,i))

これにより、400の一時ファイルが作成され、各一時ファイルに1000行が書き込まれます。それは私の目立たないマシンで1/2秒未満で実行されます。この場合、コンテキストマネージャーが開いたり閉じたりすると、合計の各一時ファイルが作成および削除されます。高速で安全なクロスプラットフォームです。

tempfile を使用する方が、再発明するよりもはるかに優れています。

2
dawg