Документация Python неофициальный перевод

tempfile.md

158 строк · 18.7 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.4/library/tempfile.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 11.6. [`tempfile`](https://python-all.ru/3.4/library/tempfile.html#module-tempfile) – Генерация временных файлов и каталогов89**Исходный код:** [Lib/tempfile.py](https://python-all.ru/src/3.4/Lib/tempfile.py)1011---1213Этот модуль генерирует временные файлы и каталоги. Он работает на всех поддерживаемых платформах. В нем появились три новые функции: [`NamedTemporaryFile()`](https://python-all.ru/3.4/library/tempfile.html#tempfile.NamedTemporaryFile), [`mkstemp()`](https://python-all.ru/3.4/library/tempfile.html#tempfile.mkstemp) и [`mkdtemp()`](https://python-all.ru/3.4/library/tempfile.html#tempfile.mkdtemp), которые должны полностью устранить необходимость в небезопасной функции [`mktemp()`](https://python-all.ru/3.4/library/tempfile.html#tempfile.mktemp). Имена временных файлов, создаваемых этим модулем, больше не содержат идентификатор процесса; вместо этого используется строка из шести случайных символов.1415Кроме того, все вызываемые пользователем функции теперь принимают дополнительные аргументы, позволяющие напрямую управлять расположением и именем временных файлов. Больше нет необходимости использовать глобальную переменную *tempdir*. Для сохранения обратной совместимости порядок аргументов несколько необычен; рекомендуется использовать именованные аргументы для ясности.1617Модуль определяет следующие вызываемые пользователем элементы:1819#### `tempfile.TemporaryFile(mode='w+b', buffering=None, encoding=None, newline=None, suffix='', prefix='tmp', dir=None)`2021Return a [*file-like object*](https://python-all.ru/3.4/glossary.html#term-file-like-object) that can be used as a temporary storage area. The file is created using [`mkstemp()`](https://python-all.ru/3.4/library/tempfile.html#tempfile.mkstemp). It will be destroyed as soon as it is closed (including an implicit close when the object is garbage collected). Under Unix, the directory entry for the file is removed immediately after the file is created. Other platforms do not support this; your code should not rely on a temporary file created using this function having or not having a visible name in the file system.2223Параметр *mode* по умолчанию равен `'w+b'`, чтобы созданный файл можно было читать и записывать без закрытия. Используется двоичный режим, чтобы он вел себя одинаково на всех платформах независимо от хранящихся данных. *buffering*, *encoding* и *newline* интерпретируются так же, как для [`open()`](https://python-all.ru/3.4/library/functions.html#open).2425Параметры *dir*, *prefix* и *suffix* передаются в [`mkstemp()`](https://python-all.ru/3.4/library/tempfile.html#tempfile.mkstemp).2627Возвращаемый объект является настоящим файловым объектом на платформах POSIX. На других платформах это объект, подобный файлу, атрибут `file` которого является базовым настоящим файловым объектом. Этот объект, подобный файлу, можно использовать в операторе [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with), как обычный файл.2829#### `tempfile.NamedTemporaryFile(mode='w+b', buffering=None, encoding=None, newline=None, suffix='', prefix='tmp', dir=None, delete=True)`3031Эта функция работает точно так же, как [`TemporaryFile()`](https://python-all.ru/3.4/library/tempfile.html#tempfile.TemporaryFile), за исключением того, что файл гарантированно имеет видимое имя в файловой системе (в Unix запись каталога не удаляется). Это имя можно получить из атрибута `name` файлового объекта. Можно ли использовать это имя для повторного открытия файла, пока именованный временный файл еще открыт, зависит от платформы (в Unix можно; в Windows NT и новее – нет). Если *delete* равен true (по умолчанию), файл удаляется сразу после закрытия. Возвращаемый объект всегда является объектом, подобным файлу, атрибут `file` которого – базовый настоящий файловый объект. Этот объект, подобный файлу, можно использовать в операторе [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with), как обычный файл.3233#### `tempfile.SpooledTemporaryFile(max_size=0, mode='w+b', buffering=None, encoding=None, newline=None, suffix='', prefix='tmp', dir=None)`3435Эта функция работает точно так же, как [`TemporaryFile()`](https://python-all.ru/3.4/library/tempfile.html#tempfile.TemporaryFile), за исключением того, что данные сохраняются в памяти, пока размер файла не превысит *max\_size* или пока не будет вызван метод `fileno()` файла; после этого содержимое записывается на диск, и работа продолжается как с [`TemporaryFile()`](https://python-all.ru/3.4/library/tempfile.html#tempfile.TemporaryFile).3637Полученный файл имеет один дополнительный метод, `rollover()`, который вызывает переход файла на дисковый файл независимо от его размера.3839Возвращаемый объект является объектом, подобным файлу, атрибут `_file` которого – либо объект [`io.BytesIO`](https://python-all.ru/3.4/library/io.html#io.BytesIO) или [`io.StringIO`](https://python-all.ru/3.4/library/io.html#io.StringIO) (в зависимости от того, был ли указан двоичный или текстовый *mode*), либо настоящий файловый объект, в зависимости от того, был ли вызван `rollover()`. Этот объект, подобный файлу, можно использовать в операторе [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with), как обычный файл.4041Изменено в версии 3.3: метод truncate теперь принимает аргумент `size`.4243#### `tempfile.TemporaryDirectory(suffix='', prefix='tmp', dir=None)`4445Эта функция создает временный каталог с помощью [`mkdtemp()`](https://python-all.ru/3.4/library/tempfile.html#tempfile.mkdtemp) (переданные аргументы передаются напрямую в базовую функцию). Полученный объект можно использовать как менеджер контекста (см. [*Менеджеры контекста оператора with*](https://python-all.ru/3.4/reference/datamodel.html#context-managers)). По завершении контекста или при уничтожении объекта временного каталога вновь созданный временный каталог и все его содержимое удаляются из файловой системы.4647Имя каталога можно получить из атрибута `name` возвращаемого объекта. Когда возвращаемый объект используется как менеджер контекста, `name` будет присвоено цели предложения [`as`](https://python-all.ru/3.4/reference/compound_stmts.html#as) в операторе [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with), если таковое имеется.4849Каталог можно явно очистить, вызвав метод `cleanup()`.5051Новое в версии 3.2.5253#### `tempfile.mkstemp(suffix='', prefix='tmp', dir=None, text=False)`5455Создает временный файл максимально безопасным способом. При создании файла не возникает состояний гонки, если платформа правильно реализует флаг [`os.O_EXCL`](https://python-all.ru/3.4/library/os.html#os.O_EXCL) для [`os.open()`](https://python-all.ru/3.4/library/os.html#os.open). Файл доступен для чтения и записи только создавшему его пользователю (UID). Если платформа использует биты разрешений для указания исполняемости файла, файл неисполним никем. Файловый дескриптор не наследуется дочерними процессами.5657В отличие от [`TemporaryFile()`](https://python-all.ru/3.4/library/tempfile.html#tempfile.TemporaryFile), пользователь [`mkstemp()`](https://python-all.ru/3.4/library/tempfile.html#tempfile.mkstemp) отвечает за удаление временного файла после завершения работы с ним.5859Если указан *suffix*, имя файла будет заканчиваться этим суффиксом, в противном случае суффикса не будет. [`mkstemp()`](https://python-all.ru/3.4/library/tempfile.html#tempfile.mkstemp) не ставит точку между именем файла и суффиксом; если она нужна, поместите её в начало *suffix*.6061Если указан *prefix*, имя файла будет начинаться с этого префикса; в противном случае используется префикс по умолчанию.6263Если указан *dir*, файл будет создан в этом каталоге; в противном случае используется каталог по умолчанию. Каталог по умолчанию выбирается из списка, зависящего от платформы, но пользователь приложения может управлять расположением каталога, задав переменные окружения *TMPDIR*, *TEMP* или *TMP*. Таким образом, нет гарантии, что сгенерированное имя файла будет обладать какими-либо удобными свойствами, например, не требовать экранирования при передаче внешним командам через `os.popen()`.6465Если указан параметр *text*, он определяет, открывать файл в двоичном режиме (по умолчанию) или в текстовом. На некоторых платформах это не имеет значения.6667[`mkstemp()`](https://python-all.ru/3.4/library/tempfile.html#tempfile.mkstemp) возвращает кортеж, содержащий дескриптор открытого файла на уровне ОС (как бы вернул [`os.open()`](https://python-all.ru/3.4/library/os.html#os.open)) и абсолютный путь к этому файлу, в указанном порядке.6869#### `tempfile.mkdtemp(suffix='', prefix='tmp', dir=None)`7071Создаёт временный каталог максимально безопасным способом. В создании каталога нет состояний гонки. Каталог доступен для чтения, записи и поиска только создавшему его пользователю.7273Пользователь [`mkdtemp()`](https://python-all.ru/3.4/library/tempfile.html#tempfile.mkdtemp) отвечает за удаление временного каталога и его содержимого после завершения работы.7475Аргументы *prefix*, *suffix* и *dir* такие же, как для [`mkstemp()`](https://python-all.ru/3.4/library/tempfile.html#tempfile.mkstemp).7677[`mkdtemp()`](https://python-all.ru/3.4/library/tempfile.html#tempfile.mkdtemp) возвращает абсолютный путь к новому каталогу.7879#### `tempfile.mktemp(suffix='', prefix='tmp', dir=None)`8081Устарело с версии 2.3: Вместо этого используйте [`mkstemp()`](https://python-all.ru/3.4/library/tempfile.html#tempfile.mkstemp).8283Возвращает абсолютный путь к файлу, которого не существовало на момент вызова. Аргументы *prefix*, *suffix* и *dir* такие же, как у [`mkstemp()`](https://python-all.ru/3.4/library/tempfile.html#tempfile.mkstemp).8485> **Предупреждение**86>87> Использование этой функции может привести к появлению уязвимости в вашей программе. К тому моменту, как вы соберетесь что-то делать с возвращённым именем файла, кто-то другой может вас опередить. Использование [`mktemp()`](https://python-all.ru/3.4/library/tempfile.html#tempfile.mktemp) можно легко заменить на [`NamedTemporaryFile()`](https://python-all.ru/3.4/library/tempfile.html#tempfile.NamedTemporaryFile), передав ей параметр `delete=False`:88>89> ```python90> >>> f = NamedTemporaryFile(delete=False)91> >>> f.name92> '/tmp/tmptjujjt'93> >>> f.write(b"Hello World!\n")94> 1395> >>> f.close()96> >>> os.unlink(f.name)97> >>> os.path.exists(f.name)98> False99> ```100101Модуль использует глобальную переменную, которая сообщает ему, как построить временное имя. Они инициализируются при первом вызове любой из описанных выше функций. Вызывающий код может изменить их, но этого делать не рекомендуется; вместо этого следует использовать соответствующие аргументы функции.102103#### `tempfile.tempdir`104105Если этой переменной присвоено значение, отличное от `None`, она определяет значение по умолчанию для аргумента *dir* всех функций, определённых в этом модуле.106107Если `tempdir` не задан или равен `None` при любом вызове любой из перечисленных выше функций, Python просматривает стандартный список каталогов и устанавливает *tempdir* равным первому каталогу, в котором вызвавший пользователь может создавать файлы. Список:1081091. Каталог, заданный переменной окружения `TMPDIR`.1102. Каталог, заданный переменной окружения `TEMP`.1113. Каталог, заданный переменной окружения `TMP`.1124. Расположение, зависящее от платформы:113114   - На Windows каталоги `C:\TEMP`, `C:\TMP`, `\TEMP` и `\TMP`, в указанном порядке.115   - На всех остальных платформах каталоги `/tmp`, `/var/tmp` и `/usr/tmp`, в указанном порядке.1165. В крайнем случае – текущий рабочий каталог.117118#### `tempfile.gettempdir()`119120Возвращает каталог, выбранный в данный момент для создания временных файлов. Если [`tempdir`](https://python-all.ru/3.4/library/tempfile.html#tempfile.tempdir) не равно `None`, эта функция просто возвращает его содержимое; в противном случае выполняется описанный выше поиск и возвращается результат.121122#### `tempfile.gettempprefix()`123124Возвращает префикс имени файла, используемый для создания временных файлов. Он не содержит компонента каталога.125126## 11.6.1. Примеры127128Вот несколько примеров типичного использования модуля [`tempfile`](https://python-all.ru/3.4/library/tempfile.html#module-tempfile):129130```python131>>> import tempfile132133# create a temporary file and write some data to it134>>> fp = tempfile.TemporaryFile()135>>> fp.write(b'Hello world!')136# read data from file137>>> fp.seek(0)138>>> fp.read()139b'Hello world!'140# close the file, it will be removed141>>> fp.close()142143# create a temporary file using a context manager144>>> with tempfile.TemporaryFile() as fp:145...     fp.write(b'Hello world!')146...     fp.seek(0)147...     fp.read()148b'Hello world!'149>>>150# file is now closed and removed151152# create a temporary directory using the context manager153>>> with tempfile.TemporaryDirectory() as tmpdirname:154...     print('created temporary directory', tmpdirname)155>>>156# directory and contents have been removed157```158