2012-05-11 3 views
4

Что является способ переименовать следующий временный файлRename питон временный файл

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 (попробуйте) удалит временный файл автоматически, как только он будет закрыт. Отключение автоматического удаления сохранит временный файл, даже если вы его не сохраните - так что это не такая хорошая идея.

Лучший способ копирования файл и позволяя питон удалить временный, когда он закрыт:

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

Хорошо выглядит. Что делать, если я хочу добавить templile в email email.attach_file (f.name) – nelsonvarela

+0

@iAmTheOneAndOnly Я не знаю о 'email.attach_file()', но если есть версия без '_file', вы, возможно, может вообще опустить генерацию файлов и просто написать 'email.attach (pdf)' для того, чтобы прикрепить данные PDF непосредственно. – glglgl

12

Лучший путь копирования файла и позволяя питон удалить временный, когда она закрыта :

Я на самом деле думаю, что вы бы лучше использовать 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(). Файл будет автоматически очищен, когда он будет закрыт.
Смежные вопросы