Автор оригинала: Doug Hellmann.
Цель:
Создайте временные объекты файловой системы.
Надежно создавая временные файлы с уникальными именами, поэтому они не могут быть догадаться кем-то, кто хочет сломать приложение или украсть данные, сложно. Модуль TEMPFILE
обеспечивает несколько функций для безопасного создания ресурсов временных файловых систем. TRUENARYFILE ()
Откроется и возвращает неназванный файл, <код> NamedTemporaryFile () Открывает и возвращает именованный файл, <код> SPALEDTEMPORARYFILE содержит свой контент в памяти перед записью
Временные файлы
Приложения, которые нуждаются в временных файлах для хранения данных, без необходимости поделиться этим файлом с другими программами, должны использовать функцию TRUMANYFILEFILE ()
для создания файлов. Функция создает файл, а на платформах, где можно немедленно разбить его. Это делает невозможным для другой программы, чтобы найти или открыть файл, поскольку в таблице файловой системой нет ссылки. Файл, созданный TRUENARYFILEFILE ()
автоматически удален, когда он будет закрыт, будь то вызова BLACK ()
или с помощью API Context Manager и с
Заявление.
tempfile_TemporaryFile.py
import os import tempfile print('Building a filename with PID:') filename '/tmp/guess_my_name.{}.txt'.format(os.getpid()) with open(filename, 'w+b') as temp: print('temp:') print(' {!r}'.format(temp)) print('temp.name:') print(' {!r}'.format(temp.name)) # Clean up the temporary file yourself. os.remove(filename) print() print('TemporaryFile:') with tempfile.TemporaryFile() as temp: print('temp:') print(' {!r}'.format(temp)) print('temp.name:') print(' {!r}'.format(temp.name)) # Automatically cleans up the file.
Этот пример иллюстрирует разницу в создании временного файла, используя общий шаблон для содействия имени, по сравнению с использованием функции TRUENARYFILE ()
. Файл, возвращенный TRUENARYFILE ()
не имеет имя.
$ python3 tempfile_TemporaryFile.py Building a filename with PID: temp: <_io.BufferedRandom> temp.name: '/tmp/guess_my_name.12151.txt' TemporaryFile: temp: <_io.BufferedRandom name=4> temp.name: 4
По умолчанию дескриптор файлов создается с помощью Mode 'W + B'
, поэтому он ведет себя последовательно на всех платформах, и вызывающий абонент может написать ему и прочитать из него.
tempfile_TemporaryFile_binary.py
import os import tempfile with tempfile.TemporaryFile() as temp: temp.write(b'Some data') temp.seek(0) print(temp.read())
После написания дескриптор файлов должен быть «перемотан», используя SEECH ()
для того, чтобы прочитать данные от него.
$ python3 tempfile_TemporaryFile_binary.py b'Some data'
Чтобы открыть файл в текстовом режиме, установите режим <код> на <код> ‘w + t’ , когда файл создан.
tempfile_TemporaryFile_text.py
import tempfile with tempfile.TemporaryFile(mode'w+t') as f: f.writelines(['first\n', 'second\n']) f.seek(0) for line in f: print(line.rstrip())
Ручка файла обрабатывает данные в виде текста.
$ python3 tempfile_TemporaryFile_text.py first second
Названные файлы
Существуют ситуации, где важны именованный временный файл. Для приложений охватывает несколько процессов или даже хостов, название файла, является самым простым способом передачи его между частями приложения. Функция NamedTemporaryFile ()
создает файл без снимая его, поэтому он сохраняет его имя (доступ с Name
атрибут).
tempfile_NamedTemporaryFile.py
import os import pathlib import tempfile with tempfile.NamedTemporaryFile() as temp: print('temp:') print(' {!r}'.format(temp)) print('temp.name:') print(' {!r}'.format(temp.name)) f pathlib.Path(temp.name) print('Exists after close:', f.exists())
Файл удален после закрытия ручки.
$ python3 tempfile_NamedTemporaryFile.py temp:temp.name: '/var/folders/5q/8gk0wq888xlggz008k8dr7180000hg/T/tmps4qh5zde' Exists after close: False
Буферные файлы
Для временных файлов, содержащих относительно небольшое количество данных, вполне вероятно, будет более эффективным использовать SPALEDTEMPRARYFILE
, потому что он содержит содержимое файла в памяти, используя <код> IO.BYTESIO или io.stringio буфер, пока они не достигнут порогового размера. Когда объем данных передает пороговое значение, он «прокат» и записан на диск, а затем буфер заменяется нормальным <кодом> временной () .
tempfile_SpooledTemporaryFile.py
import tempfile with tempfile.SpooledTemporaryFile(max_size100, mode'w+t', encoding'utf-8') as temp: print('temp: {!r}'.format(temp)) for i in range(3): temp.write('This line is repeated over and over.\n') print(temp._rolled, temp._file)
Этот пример использует частные атрибуты SPALEDTEMPORAFILEFILE
, чтобы определить, когда произошел ролик на диск. Обычно не нужно проверять этот статус, за исключением настройки размера буфера.
$ python3 tempfile_SpooledTemporaryFile.py temp:False <_io.StringIO object at 0x1007a3d38> False <_io.StringIO object at 0x1007a3d38> True <_io.TextIOWrapper name=4>
Чтобы явно привести к записанию буфера на диск, вызовите <код> Rollover () или Fileno ()
методы.
tempfile_SpooledTemporaryFile_explicit.py
import tempfile with tempfile.SpooledTemporaryFile(max_size1000, mode'w+t', encoding'utf-8') as temp: print('temp: {!r}'.format(temp)) for i in range(3): temp.write('This line is repeated over and over.\n') print(temp._rolled, temp._file) print('rolling over') temp.rollover() print(temp._rolled, temp._file)
В этом примере, потому что размер буфера намного больше, чем объем данных, файл не будет создан на диске, за исключением того, что <код> Rollover () был вызван.
$ python3 tempfile_SpooledTemporaryFile_explicit.py temp:False <_io.StringIO object at 0x1007a3d38> False <_io.StringIO object at 0x1007a3d38> False <_io.StringIO object at 0x1007a3d38> rolling over True <_io.TextIOWrapper name=4>
Временные каталоги
Когда необходимы несколько временных файлов, может быть удобнее создать один временный каталог с TRAMARYDirectory
и открыть все файлы в этом каталоге.
tempfile_TemporaryDirectory.py
import pathlib import tempfile with tempfile.TemporaryDirectory() as directory_name: the_dir pathlib.Path(directory_name) print(the_dir) a_file the_dir / 'a_file.txt' a_file.write_text('This file is deleted.') print('Directory exists after?', the_dir.exists()) print('Contents after:', list(the_dir.glob('*')))
Диспетчер контекста производит имя каталога, которое затем может использоваться в блоке контекста, чтобы построить другие имена файлов.
$ python3 tempfile_TemporaryDirectory.py /var/folders/5q/8gk0wq888xlggz008k8dr7180000hg/T/tmp_urhiioj Directory exists after? False Contents after: []
Прогнозировать имена
В то время как менее безопасны, чем строго анонимные временные файлы, включая предсказуемую часть во имя имени позволяет найти файл и изучить его для целей отладки. Все функции, описанные до сих пор, возьмите три аргумента, чтобы контролировать имена имена файлов. Имена генерируются с использованием формулы:
dir + prefix + random + suffix
Все значения, кроме <Код> Случайный могут быть переданы как аргументы функциям для создания временных файлов или каталогов.
tempfile_NamedTemporaryFile_args.py
import tempfile with tempfile.NamedTemporaryFile(suffix'_suffix', prefix'prefix_', dir'/tmp') as temp: print('temp:') print(' ', temp) print('temp.name:') print(' ', temp.name)
префикс и sugments
аргументы сочетаются со случайной строкой символов для создания имени файла, а также аргумент dir как местоположение нового файла.
$ python3 tempfile_NamedTemporaryFile_args.py temp:temp.name: /tmp/prefix_q6wd5czl_suffix
Временное местоположение файла
Если явное назначение не дано с использованием аргумента Dir
, путь, используемый для временных файлов, будет варьироваться в зависимости от текущей платформы и настройки. Модуль TEMPFILE
включает в себя две функции для запроса параметров, используемых во время выполнения.
tempfile_settings.py
import tempfile print('gettempdir():', tempfile.gettempdir()) print('gettempprefix():', tempfile.gettempprefix())
<Код> getTempdir () Возвращает каталог по умолчанию, который будет держать все временные файлы и <код> getTemppix () возвращает префикс строки для новых имен файлов и каталогов.
$ python3 tempfile_settings.py gettempdir(): /var/folders/5q/8gk0wq888xlggz008k8dr7180000hg/T gettempprefix(): tmp
Значение, возвращенное gettempdir ()
устанавливается на основе простого алгоритма просмотрения списка локаций для первого места. Текущий процесс может создать файл. Список поиска:
- П
- е
- р
- е
- м
- е
- н
- н
- а
- я
- с
- р
- е
- д
- ы
- <
- К
- о
- д
- >
- T
- M
- P
- D
- I
- R
- <
- /
- к
- о
- д
- >
- П
- е
- р
- е
- м
- е
- н
- н
- а
- я
- с
- р
- е
- д
- ы
- <
- К
- о
- д
- >
- T
- e
- m
- p
- <
- /
- к
- о
- д
- >
- П
- е
- р
- е
- м
- е
- н
- н
- а
- я
- с
- р
- е
- д
- ы
- <
- К
- о
- д
- >
- T
- M
- P
- <
- /
- к
- о
- д
- >
- З
- а
- п
- а
- с
- ,
- н
- а
- о
- с
- н
- о
- в
- е
- п
- л
- а
- т
- ф
- о
- р
- м
- ы
- .
- (
- W
- i
- n
- d
- o
- w
- s
- и
- с
- п
- о
- л
- ь
- з
- у
- е
- т
- п
- е
- р
- в
- ы
- й
- д
- о
- с
- т
- у
- п
- н
- ы
- й
- <
- к
- о
- д
- >
- C
- :
- \
- T
- e
- m
- p
- <
- /
- к
- о
- д
- >
- ,
- <
- к
- о
- д
- >
- C
- :
- \
- T
- M
- P
- <
- /
- к
- о
- д
- >
- ,
- <
- к
- о
- д
- >
- \
- t
- e
- m
- p
- <
- /
- к
- о
- д
- >
- и
- л
- и
- <
- к
- о
- д
- >
- \
- t
- m
- p
- <
- /
- c
- o
- d
- e
- >
- .
- Д
- р
- у
- г
- и
- е
- п
- л
- а
- т
- ф
- о
- р
- м
- ы
- и
- с
- п
- о
- л
- ь
- з
- у
- ю
- т
- <
- к
- о
- д
- >
- /
- t
- m
- p
- <
- /
- c
- o
- d
- e
- >
- ,
- <
- к
- о
- д
- >
- /
- v
- a
- r
- /
- t
- m
- p
- <
- /
- c
- o
- d
- e
- >
- и
- л
- и
- <
- к
- о
- д
- >
- /
- u
- s
- r
- /
- t
- m
- p
- <
- /
- c
- o
- d
- e
- >
- .
- )
- Е
- с
- л
- и
- д
- р
- у
- г
- о
- й
- к
- а
- т
- а
- л
- о
- г
- н
- е
- м
- о
- ж
- е
- т
- б
- ы
- т
- ь
- н
- а
- й
- д
- е
- н
- ,
- т
- е
- к
- у
- щ
- и
- й
- р
- а
- б
- о
- ч
- и
- й
- к
- а
- т
- а
- л
- о
- г
- и
- с
- п
- о
- л
- ь
- з
- у
- е
- т
- с
- я
- .
tempfile_tempdir.py
import tempfile tempfile.tempdir '/I/changed/this/path' print('gettempdir():', tempfile.gettempdir())
Программы, которые должны использовать глобальное место для всех временных файлов без использования каких-либо из этих переменных среды, должны устанавливать <код> tempfile.tempdir непосредственно путем назначения значения переменной.
$ python3 tempfile_tempdir.py gettempdir(): /I/changed/this/path
Смотрите также
- Стандартная библиотечная документация для tempfile
- Случайные – PSuedOrandom Number Generators, используемые для введения случайных значений во временные имена файлов