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

tempfile.md

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

1> **Источник:** https://python-all.ru/3.8/library/tempfile.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`tempfile`](https://python-all.ru/3.8/library/tempfile.html#module-tempfile) – Создание временных файлов и каталогов89**Исходный код:** [Lib/tempfile.py](https://python-all.ru/src/3.8/Lib/tempfile.py)1011---1213Этот модуль создаёт временные файлы и каталоги. Он работает на всех поддерживаемых платформах. [`TemporaryFile`](https://python-all.ru/3.8/library/tempfile.html#tempfile.TemporaryFile), [`NamedTemporaryFile`](https://python-all.ru/3.8/library/tempfile.html#tempfile.NamedTemporaryFile), [`TemporaryDirectory`](https://python-all.ru/3.8/library/tempfile.html#tempfile.TemporaryDirectory) и [`SpooledTemporaryFile`](https://python-all.ru/3.8/library/tempfile.html#tempfile.SpooledTemporaryFile) – высокоуровневые интерфейсы, которые обеспечивают автоматическую очистку и могут использоваться как менеджеры контекста. [`mkstemp()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.mkstemp) и [`mkdtemp()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.mkdtemp) – низкоуровневые функции, требующие ручной очистки.1415Все вызываемые пользователем функции и конструкторы принимают дополнительные аргументы, позволяющие напрямую управлять расположением и именем временных файлов и каталогов. Имена файлов, используемые этим модулем, содержат строку случайных символов, что позволяет безопасно создавать эти файлы в общих временных каталогах. Для сохранения обратной совместимости порядок аргументов несколько необычен; для ясности рекомендуется использовать именованные аргументы.1617Модуль определяет следующие вызываемые пользователем элементы:1819#### `tempfile.TemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)`2021Возвращает [файлоподобный объект](https://python-all.ru/3.8/glossary.html#term-file-like-object), который можно использовать как временное хранилище. Файл создаётся безопасно по тем же правилам, что и [`mkstemp()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.mkstemp). Он будет уничтожен сразу после закрытия (включая неявное закрытие при сборке мусора). В Unix запись каталога для файла либо вообще не создаётся, либо удаляется сразу после создания файла. Другие платформы этого не поддерживают; ваш код не должен полагаться на то, имеет ли временный файл, созданный с помощью этой функции, видимое имя в файловой системе или нет.2223Полученный объект можно использовать как менеджер контекста (см. [Примеры](https://python-all.ru/3.8/library/tempfile.html#tempfile-examples)). После завершения работы контекста или уничтожения файлового объекта временный файл будет удалён из файловой системы.2425Параметр *mode* по умолчанию равен `'w+b'`, чтобы созданный файл можно было читать и записывать без закрытия. Используется двоичный режим, чтобы обеспечить единообразное поведение на всех платформах независимо от хранящихся данных. Параметры *buffering*, *encoding*, *errors* и *newline* интерпретируются так же, как для [`open()`](https://python-all.ru/3.8/library/functions.html#open).2627Параметры *dir*, *prefix* и *suffix* имеют тот же смысл и значения по умолчанию, что и в [`mkstemp()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.mkstemp).2829Возвращаемый объект является настоящим файловым объектом на платформах POSIX. На других платформах это файлоподобный объект, атрибут `file` которого является базовым настоящим файловым объектом.3031Флаг [`os.O_TMPFILE`](https://python-all.ru/3.8/library/os.html#os.O_TMPFILE) используется, если он доступен и работает (только для Linux, требуется ядро Linux версии 3.11 или новее).3233Вызывает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `tempfile.mkstemp` с аргументом `fullpath`.3435Изменено в версии 3.5: Теперь флаг [`os.O_TMPFILE`](https://python-all.ru/3.8/library/os.html#os.O_TMPFILE) используется, если доступен.3637Изменено в версии 3.8: Добавлен параметр *errors*.3839#### `tempfile.NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True, *, errors=None)`4041Эта функция работает точно так же, как [`TemporaryFile()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.TemporaryFile), за исключением того, что файл гарантированно имеет видимое имя в файловой системе (в Unix запись в каталоге не удаляется). Это имя можно получить из атрибута `name` возвращаемого файлоподобного объекта. Возможность использовать это имя для повторного открытия файла, пока именованный временный файл ещё открыт, зависит от платформы (в Unix это возможно; в Windows NT и новее – нет). Если *delete* равен true (по умолчанию), файл удаляется сразу после закрытия. Возвращаемый объект всегда является файлоподобным объектом, чей `file` атрибут является базовым настоящим файловым объектом. Этот файлоподобный объект можно использовать в операторе [`with`](https://python-all.ru/3.8/reference/compound_stmts.html#with), как обычный файл.4243Вызывает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `tempfile.mkstemp` с аргументом `fullpath`.4445Изменено в версии 3.8: Добавлен параметр *errors*.4647#### `tempfile.SpooledTemporaryFile(max_size=0, mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)`4849Эта функция работает точно так же, как [`TemporaryFile()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.TemporaryFile), за исключением того, что данные буферизируются в памяти, пока размер файла не превысит *max\_size*, или пока не будет вызван метод `fileno()`, после чего содержимое записывается на диск и работа продолжается как с [`TemporaryFile()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.TemporaryFile).5051У полученного файла есть один дополнительный метод, `rollover()`, который вызывает переключение на файл на диске независимо от его размера.5253Возвращаемый объект является файлоподобным объектом, чей атрибут `_file` является либо объектом [`io.BytesIO`](https://python-all.ru/3.8/library/io.html#io.BytesIO), либо [`io.TextIOWrapper`](https://python-all.ru/3.8/library/io.html#io.TextIOWrapper) (в зависимости от того, был ли указан бинарный или текстовый *режим*), либо настоящим файловым объектом, в зависимости от того, вызывался ли `rollover()`. Этот файлоподобный объект можно использовать в операторе [`with`](https://python-all.ru/3.8/reference/compound_stmts.html#with), как и обычный файл.5455Изменено в версии 3.3: метод truncate теперь принимает аргумент `size`.5657Изменено в версии 3.8: Добавлен параметр *errors*.5859#### `tempfile.TemporaryDirectory(suffix=None, prefix=None, dir=None)`6061Эта функция безопасно создаёт временный каталог по тем же правилам, что и [`mkdtemp()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.mkdtemp). Полученный объект можно использовать как контекстный менеджер (см. [Примеры](https://python-all.ru/3.8/library/tempfile.html#tempfile-examples)). По завершении контекста или уничтожении объекта временного каталога, созданный временный каталог и всё его содержимое удаляются из файловой системы.6263Имя каталога можно получить из атрибута `name` возвращаемого объекта. Если возвращаемый объект используется как менеджер контекста, то `name` будет присвоен цели предложения `as` в инструкции [`with`](https://python-all.ru/3.8/reference/compound_stmts.html#with), если она есть.6465Каталог можно явно очистить, вызвав метод `cleanup()`.6667Вызывает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `tempfile.mkdtemp` с аргументом `fullpath`.6869Новое в версии 3.2.7071#### `tempfile.mkstemp(suffix=None, prefix=None, dir=None, text=False)`7273Создаёт временный файл наиболее безопасным способом. В процессе создания файла не возникает состояний гонки, если платформа правильно реализует флаг [`os.O_EXCL`](https://python-all.ru/3.8/library/os.html#os.O_EXCL) для [`os.open()`](https://python-all.ru/3.8/library/os.html#os.open). Файл доступен для чтения и записи только создавшему его пользователю. Если платформа использует биты разрешений для указания на исполняемость файла, то файл не является исполняемым никем. Файловый дескриптор не наследуется дочерними процессами.7475В отличие от [`TemporaryFile()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.TemporaryFile), пользователь [`mkstemp()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.mkstemp) отвечает за удаление временного файла после завершения работы с ним.7677Если *suffix* не равен `None`, имя файла будет заканчиваться на этот суффикс, иначе суффикса не будет. [`mkstemp()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.mkstemp) не ставит точку между именем файла и суффиксом; если она нужна, поместите её в начало *suffix*.7879Если *prefix* не равен `None`, имя файла будет начинаться с этого префикса; иначе используется префикс по умолчанию. По умолчанию берётся возвращаемое значение [`gettempprefix()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.gettempprefix) или [`gettempprefixb()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.gettempprefixb), в зависимости от ситуации.8081Если *dir* не равен `None`, файл будет создан в этом каталоге; иначе используется каталог по умолчанию. Каталог по умолчанию выбирается из списка, зависящего от платформы, но пользователь приложения может управлять расположением каталога, установив переменные окружения *TMPDIR*, *TEMP* или *TMP*. Поэтому нет гарантии, что сгенерированное имя файла будет обладать какими-либо полезными свойствами, например, не требовать экранирования при передаче внешним командам через `os.popen()`.8283Если любой из *suffix*, *prefix* и *dir* не равен `None`, они должны быть одного типа. Если они являются bytes, возвращаемое имя будет bytes, а не str. Если нужно принудительно получить bytes при остальных значениях по умолчанию, передайте `suffix=b''`.8485Если *text* указан и равен true, файл открывается в текстовом режиме. В противном случае (по умолчанию) файл открывается в бинарном режиме.8687[`mkstemp()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.mkstemp) возвращает кортеж, содержащий дескриптор открытого файла на уровне ОС (как возвращается [`os.open()`](https://python-all.ru/3.8/library/os.html#os.open)) и абсолютное имя пути к этому файлу, в указанном порядке.8889Вызывает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `tempfile.mkstemp` с аргументом `fullpath`.9091Изменено в версии 3.5: *suffix*, *prefix* и *dir* теперь могут передаваться в байтах для получения возвращаемого значения в байтах. Ранее допускалась только str. *suffix* и *prefix* теперь принимают и по умолчанию равны `None`, чтобы использовать подходящее значение по умолчанию.9293Изменено в версии 3.6: Параметр *dir* теперь принимает [path-like object](https://python-all.ru/3.8/glossary.html#term-path-like-object).9495#### `tempfile.mkdtemp(suffix=None, prefix=None, dir=None)`9697Создаёт временный каталог максимально безопасным способом. В создании каталога нет состояний гонки. Каталог доступен для чтения, записи и поиска только создавшему его пользователю.9899Пользователь [`mkdtemp()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.mkdtemp) отвечает за удаление временного каталога и его содержимого после использования.100101Аргументы *prefix*, *suffix* и *dir* такие же, как для [`mkstemp()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.mkstemp).102103[`mkdtemp()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.mkdtemp) возвращает абсолютный путь к новому каталогу.104105Вызывает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `tempfile.mkdtemp` с аргументом `fullpath`.106107Изменено в версии 3.5: *suffix*, *prefix* и *dir* теперь могут передаваться в байтах для получения возвращаемого значения в байтах. Ранее допускалась только str. *suffix* и *prefix* теперь принимают и по умолчанию равны `None`, чтобы использовать подходящее значение по умолчанию.108109Изменено в версии 3.6: Параметр *dir* теперь принимает [path-like object](https://python-all.ru/3.8/glossary.html#term-path-like-object).110111#### `tempfile.gettempdir()`112113Возвращает имя каталога, используемого для временных файлов. Оно определяет значение по умолчанию для аргумента *dir* во всех функциях этого модуля.114115Python просматривает стандартный список каталогов, чтобы найти тот, в котором вызывающий пользователь может создавать файлы. Список:1161171. Каталог, заданный переменной окружения `TMPDIR`.1182. Каталог, заданный переменной окружения `TEMP`.1193. Каталог, заданный переменной окружения `TMP`.1204. Расположение, зависящее от платформы:121122   - В Windows – каталоги `C:\TEMP`, `C:\TMP`, `\TEMP` и `\TMP` в указанном порядке.123   - На всех остальных платформах – каталоги `/tmp`, `/var/tmp` и `/usr/tmp` в указанном порядке.1245. В крайнем случае – текущий рабочий каталог.125126Результат этого поиска кэшируется; см. описание [`tempdir`](https://python-all.ru/3.8/library/tempfile.html#tempfile.tempdir) ниже.127128#### `tempfile.gettempdirb()`129130То же, что [`gettempdir()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.gettempdir), но возвращаемое значение в байтах.131132Новое в версии 3.5.133134#### `tempfile.gettempprefix()`135136Возвращает префикс имени файла, используемый для создания временных файлов. Он не содержит компонента каталога.137138#### `tempfile.gettempprefixb()`139140То же, что [`gettempprefix()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.gettempprefix), но возвращаемое значение в байтах.141142Новое в версии 3.5.143144Модуль использует глобальную переменную для хранения имени каталога, используемого для временных файлов, возвращаемых функцией [`gettempdir()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.gettempdir). Её можно установить напрямую, чтобы переопределить процесс выбора, но этого делать не рекомендуется. Все функции в этом модуле принимают аргумент *dir*, который можно использовать для указания каталога, и это рекомендуемый подход.145146#### `tempfile.tempdir`147148Если задано значение, отличное от `None`, эта переменная определяет значение по умолчанию для аргумента *dir* функций, определённых в этом модуле.149150Если `tempdir` равно `None` (значение по умолчанию) при любом вызове любой из перечисленных выше функций, кроме [`gettempprefix()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.gettempprefix), она инициализируется по алгоритму, описанному в [`gettempdir()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.gettempdir).151152## Примеры153154Вот несколько примеров типичного использования модуля [`tempfile`](https://python-all.ru/3.8/library/tempfile.html#module-tempfile):155156```python157>>> import tempfile158159# create a temporary file and write some data to it160>>> fp = tempfile.TemporaryFile()161>>> fp.write(b'Hello world!')162# read data from file163>>> fp.seek(0)164>>> fp.read()165b'Hello world!'166# close the file, it will be removed167>>> fp.close()168169# create a temporary file using a context manager170>>> with tempfile.TemporaryFile() as fp:171...     fp.write(b'Hello world!')172...     fp.seek(0)173...     fp.read()174b'Hello world!'175>>>176# file is now closed and removed177178# create a temporary directory using the context manager179>>> with tempfile.TemporaryDirectory() as tmpdirname:180...     print('created temporary directory', tmpdirname)181>>>182# directory and contents have been removed183```184185## Устаревшие функции и переменные186187Раньше для создания временных файлов сначала генерировали имя с помощью функции [`mktemp()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.mktemp), а затем создавали файл с этим именем. К сожалению, это небезопасно, так как другой процесс может создать файл с таким именем в промежутке между вызовом [`mktemp()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.mktemp) и последующей попыткой первого процесса создать файл. Решение – объединить два шага и создавать файл сразу. Этот подход используется в [`mkstemp()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.mkstemp) и других описанных выше функциях.188189#### `tempfile.mktemp(suffix='', prefix='tmp', dir=None)`190191Устарело с версии 2.3: Используйте [`mkstemp()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.mkstemp) вместо.192193Возвращает абсолютное имя пути к файлу, который не существовал на момент вызова. Аргументы *prefix*, *suffix* и *dir* аналогичны аргументам [`mkstemp()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.mkstemp), за исключением того, что имена файлов в байтах, `suffix=None` и `prefix=None` не поддерживаются.194195> **Предупреждение**196>197> Использование этой функции может привести к дыре в безопасности программы. К тому моменту, когда вы начнёте что-либо делать с возвращённым именем файла, кто-то другой может вас опередить. Использование [`mktemp()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.mktemp) можно легко заменить на [`NamedTemporaryFile()`](https://python-all.ru/3.8/library/tempfile.html#tempfile.NamedTemporaryFile), передав ему параметр `delete=False`:198>199> ```python200> >>> f = NamedTemporaryFile(delete=False)201> >>> f.name202> '/tmp/tmptjujjt'203> >>> f.write(b"Hello World!\n")204> 13205> >>> f.close()206> >>> os.unlink(f.name)207> >>> os.path.exists(f.name)208> False209> ```210