2012-06-15 3 views
21

Я работаю над скриптом Python, которому необходимо создать около 50 отдельных временных файлов, которые все приложены часто во время сценария и объединены в конце. Я уверен, что модуль tempfile может делать то, что мне нужно, но мне не удалось выяснить, как читать документацию.Как использовать временный файл Python.NamedTemporaryFile()?

Я хочу использовать временные файлы - в отличие от переменных - для сохранения системной памяти, поскольку эти куски данных становятся большими, поскольку скрипт обрабатывает десятки тысяч других файлов.

Следующий фрагмент кода является хак настоящее время я использую для создания этих файлов (untemporarily) в качестве untemporary каталоге:

item = (string from another file) # string must id file for future use 
tmpfile = 'tmpfiles/' + item 
if item not in totalitems: 
    totalitems.add(item) 
    with open(tmpfile, 'w') as itemfile: 
     output = some stuff 
     tmpfile.write(output) 
else: 
    with open(tmpfile, 'a') as itemfile: 
     output = different stuff 
     tmpfile.write(output) 

Я думаю, что мне нужно tempfile.NamedTemporaryFile(). Согласно documentation:

Это имя может быть получено от имени члена файлового объекта.

К сожалению, я не понимаю, что это значит. Мне просто нужно снова вызвать каждый файл позже, когда я снова перейду через свой «элемент» в файлы, которые я обрабатываю. Я предполагаю, что это довольно прямолинейно, и я просто плотный. В случае, если это имеет значение, у меня есть версии этого скрипта для Python 2.7.1 и 3.2.3. Мне действительно нужно, чтобы тот или иной работал; Я создал как учебное упражнение.

+0

возможно дубликат [Лучший способ для генерации случайных имен файлов в Python] (http://stackoverflow.com/questions/10501247/best-way- to-generate-random-file-names-in-python) – Joe

+1

@Joe, часть этого вопроса представляется дубликатом связанного потока. Частично это не так; см. комментарий в ответ Левона ниже. – Gregory

+0

Зачем нужны эти файлы? Если они неназванные (предварительно удаленные), в плане очистки происходит меньше ошибок. Вы можете просто сохранить объект tmpfile, а не его имя, а затем вызвать 'seek (0)', чтобы перейти к началу, чтобы быть готовым к чтению ... или mmap его содержимое, или иным образом получить доступ к нему, как вам нравится. –

ответ

34

«Это имя может быть получено от имени члена файлового объекта».

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

In [4]: import tempfile 

In [5]: tf = tempfile.NamedTemporaryFile() 
In [6]: tf.name # retrieve the name of the temp file just created 
Out[6]: 'c:\\blabla\\locals~1\\temp\\tmptecp3i' 

Примечание: По умолчанию файл будет удален, если он закрыт. Однако, если параметр delete False, файл не будет автоматически удален. См. Python docs для получения дополнительной информации.

Поскольку вы можете получить имя каждого из 50 временных файлов, которые вы хотите создать, вы можете сохранить их, например, в списке, прежде чем использовать их позже (как вы говорите). Просто не забудьте установить значение delete, чтобы файлы не исчезали, когда вы их закрываете (в случае, если вы планируете закрыть, а затем снова их откройте).

Я объяснил, как создать временные имена более подробно здесь Best way to generate random file names in Python

+0

Спасибо за ссылку на тему с вашим исходным ответом. Я все еще не уверен, как указать файл в значение переменной «item». Я ударил по идее использовать словарь для этого; похоже ли это соответствует следующей строке 5 в вашем коде выше? 'Item_tmpfile = {Пункт: tf.name}'. Затем я могу позже вызвать 'item_tmpfile [item]'. – Gregory

+0

@pyrogerg Да, я думаю, что это должно сработать, вы бы связали имя каждого временного файла с другим 'item', где' item' будет ключом для получения имени файла temp позже. Я предполагаю, что у вашего словаря будет в конечном итоге 50 записей, не так ли? Планируете ли вы закрыть файлы между приложениями? если это так, обратите внимание на параметр 'delete'. – Levon

+0

Спасибо за отзыв 'delete'; Я понял это в вашем первоначальном ответе. Думаю, я сейчас на правильном пути. Я предполагаю, что я могу использовать эти файлы, как и любые другие в ходе сценария, например. 'with open (item_tmpfiles [item]) как tf:'? – Gregory

Смежные вопросы