いくつかのコンテンツを含む一時ファイルと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()
のようなものですか?
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
最も簡単な方法は、ファイルを書き込みモードで開いてから閉じることです。たとえば、ファイル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()
あなたはこれを行うことができます:
def deleteContent(pfile):
fn=pfile.name
pfile.close()
return open(fn,'w')
このようなものよりも簡単なものは何ですか:
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 を使用する方が、再発明するよりもはるかに優れています。