2012-05-11 21 views
4

名前の変更Pythonの一時ファイル

pdf = render_me_some_pdf() #PDF RENDER 
f = tempfile.NamedTemporaryFile() 
f.write(pdf) 
f.flush() 

は私がos.renameについて代を読み、次の一時ファイルの名前を変更する方法は何ですが、私は本当に今、それは

+0

[私はPythonを使用して一時ファイルをディスクに保存する方法は?](http://stackoverflow.com/questions/94153/how-do-i-persist-to-disk-a-temporary -file-using-python) – ThiefMaster

答えて

5

あなたは経由でファイル名にアクセスすることができますどのように適用するかしないでくださいf.name。ただし、delete=Falseを使用しない限り、Pythonは閉じられた時点で自動的に一時ファイルを削除しようとします。自動削除を無効にすると、保存しなくても一時ファイルが保持されます。これはあまり良い考えではありません。

最良の方法は、コピーファイルと、それが閉じていたときにPythonが一時的なものを削除させることである:

import shutil 
shutil.copy(f.name, 'new-name') 
+0

よく見えます。もし私が電子メールのemail.attach_file(f.name)にtemplileを添付したいのなら、どうすればいいですか? – nelsonvarela

+0

@iAmTheOneAndOnly私は 'email.attach_file()'について知らないのですが、 '_file'のないバージョンもあればファイルの生成を完全に省略して、PDFデータ自体を添付するために 'email.attach(pdf)'を実行するだけです。 – glglgl

12

最良の方法は、ファイルをコピーし、それが閉じていたときにPythonが一時的なものを削除させて頂いており:

私は実際にあなたがos.linkを使用したほうが良いと思います。

with tempfile.NamedTemporaryFile(dir=os.path.dirname(actual_name)) as f: 
    f.write(pdf) 
    os.link(f.name, actual_name) 

これはos.linkを使用してテンポラリファイルへのハードリンクを作成します。 は、テンポラリファイルが自動的に削除された後も維持されます。

このコードはいくつかの利点があります。

  • 私たちは、コンテキストマネージャとしてtempfileオブジェクトを使用しているので、私たちは は、明示的にクローズを心配する必要はありません。
  • 大きなファイルをコピーするため、ファイルへのハードリンクを作成するので、コピーするのではなく、 を使用してディスクスペースや時間の消費を心配する必要はありません。
  • データをコピーしないので、f.flush()に電話する必要はありません。 ファイルが閉じられると自動的にフラッシュされます。
関連する問題