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

tempfile.md

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

1> **Источник:** https://python-all.ru/3.11/library/tempfile.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`tempfile`](https://python-all.ru/3.11/library/tempfile.html#module-tempfile) – Создание временных файлов и каталогов89**Исходный код:** [Lib/tempfile.py](https://python-all.ru/src/3.11/Lib/tempfile.py)1011---1213Этот модуль создаёт временные файлы и каталоги. Он работает на всех поддерживаемых платформах. [`TemporaryFile`](https://python-all.ru/3.11/library/tempfile.html#tempfile.TemporaryFile), [`NamedTemporaryFile`](https://python-all.ru/3.11/library/tempfile.html#tempfile.NamedTemporaryFile), [`TemporaryDirectory`](https://python-all.ru/3.11/library/tempfile.html#tempfile.TemporaryDirectory) и [`SpooledTemporaryFile`](https://python-all.ru/3.11/library/tempfile.html#tempfile.SpooledTemporaryFile) – это высокоуровневые интерфейсы, которые обеспечивают автоматическую очистку и могут использоваться как [менеджеры контекста](https://python-all.ru/3.11/glossary.html#term-context-manager). [`mkstemp()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.mkstemp) и [`mkdtemp()`](https://python-all.ru/3.11/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.11/glossary.html#term-file-like-object), который можно использовать как временное хранилище. Файл создаётся безопасно по тем же правилам, что и [`mkstemp()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.mkstemp). Он будет уничтожен сразу после закрытия (включая неявное закрытие при сборке мусора). В Unix запись каталога для файла либо вообще не создаётся, либо удаляется сразу после создания файла. Другие платформы этого не поддерживают; ваш код не должен полагаться на то, имеет ли временный файл, созданный с помощью этой функции, видимое имя в файловой системе или нет.2223Полученный объект можно использовать как [менеджер контекста](https://python-all.ru/3.11/glossary.html#term-context-manager) (см. [Примеры](https://python-all.ru/3.11/library/tempfile.html#tempfile-examples)). После завершения контекста или уничтожения файлового объекта временный файл будет удалён из файловой системы.2425Параметр *mode* по умолчанию равен `'w+b'`, чтобы созданный файл можно было читать и записывать без закрытия. Используется двоичный режим, чтобы обеспечить единообразное поведение на всех платформах независимо от хранящихся данных. Параметры *buffering*, *encoding*, *errors* и *newline* интерпретируются так же, как для [`open()`](https://python-all.ru/3.11/library/functions.html#open).2627Параметры *dir*, *prefix* и *suffix* имеют тот же смысл и значения по умолчанию, что и в [`mkstemp()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.mkstemp).2829Возвращаемый объект является настоящим файловым объектом на платформах POSIX. На других платформах это файлоподобный объект, атрибут `file` которого является базовым настоящим файловым объектом.3031Флаг [`os.O_TMPFILE`](https://python-all.ru/3.11/library/os.html#os.O_TMPFILE) используется, если он доступен и работает (только для Linux, требуется ядро Linux версии 3.11 или новее).3233На платформах, которые не являются ни POSIX, ни Cygwin, TemporaryFile является псевдонимом для NamedTemporaryFile.3435Вызывает [событие аудита](https://python-all.ru/3.11/library/sys.html#auditing) `tempfile.mkstemp` с аргументом `fullpath`.3637Изменено в версии 3.5: Теперь флаг [`os.O_TMPFILE`](https://python-all.ru/3.11/library/os.html#os.O_TMPFILE) используется, если доступен.3839Изменено в версии 3.8: Добавлен параметр *errors*.4041#### `tempfile.NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True, *, errors=None)`4243Эта функция работает точно так же, как [`TemporaryFile()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.TemporaryFile), за исключением того, что файл гарантированно имеет видимое имя в файловой системе (в Unix запись в каталоге не удаляется). Это имя можно получить из атрибута `name` возвращаемого файлоподобного объекта. Возможность повторно открыть файл по этому имени, пока временный файл с именем ещё открыт, зависит от платформы (в Unix это возможно, в Windows – нет). Если *delete* равно True (по умолчанию), файл удаляется сразу после закрытия. Возвращаемый объект всегда является файлоподобным объектом, чей атрибут `file` является лежащим в основе настоящим файловым объектом. Этот файлоподобный объект можно использовать в операторе [`with`](https://python-all.ru/3.11/reference/compound_stmts.html#with), как обычный файл.4445Только в POSIX процесс, который был внезапно завершён с помощью SIGKILL, не может автоматически удалить созданные им NamedTemporaryFiles.4647Вызывает [событие аудита](https://python-all.ru/3.11/library/sys.html#auditing) `tempfile.mkstemp` с аргументом `fullpath`.4849Изменено в версии 3.8: Добавлен параметр *errors*.5051#### `class tempfile.SpooledTemporaryFile(max_size=0, mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)`5253Этот класс работает точно так же, как [`TemporaryFile()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.TemporaryFile), за исключением того, что data накапливаются в памяти, пока размер файла не превысит *max\_size*, или пока не будет вызван метод [`fileno()`](https://python-all.ru/3.11/library/io.html#io.IOBase.fileno) файла; после этого содержимое записывается на диск и работа продолжается как с [`TemporaryFile()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.TemporaryFile).5455#### `rollover()`5657У полученного файла есть один дополнительный метод, `rollover()`, который вызывает переключение на файл на диске независимо от его размера.5859Возвращаемый объект является файлоподобным объектом, чей атрибут `_file` является либо объектом [`io.BytesIO`](https://python-all.ru/3.11/library/io.html#io.BytesIO), либо [`io.TextIOWrapper`](https://python-all.ru/3.11/library/io.html#io.TextIOWrapper) (в зависимости от того, был ли указан бинарный или текстовый *режим*), либо настоящим файловым объектом, в зависимости от того, вызывался ли [`rollover()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.SpooledTemporaryFile.rollover). Этот файлоподобный объект можно использовать в операторе [`with`](https://python-all.ru/3.11/reference/compound_stmts.html#with), как и обычный файл.6061Изменено в версии 3.3: метод truncate теперь принимает аргумент *size*.6263Изменено в версии 3.8: Добавлен параметр *errors*.6465Изменено в версии 3.11: Полностью реализует абстрактные базовые классы [`io.BufferedIOBase`](https://python-all.ru/3.11/library/io.html#io.BufferedIOBase) и [`io.TextIOBase`](https://python-all.ru/3.11/library/io.html#io.TextIOBase) (в зависимости от того, был ли указан бинарный или текстовый *режим*).6667#### `class tempfile.TemporaryDirectory(suffix=None, prefix=None, dir=None, ignore_cleanup_errors=False)`6869Этот класс безопасно создаёт временный каталог, используя те же правила, что и [`mkdtemp()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.mkdtemp). Полученный объект может использоваться как [менеджер контекста](https://python-all.ru/3.11/glossary.html#term-context-manager) (см. [Примеры](https://python-all.ru/3.11/library/tempfile.html#tempfile-examples)). По завершении контекста или уничтожении объекта временного каталога вновь созданный временный каталог и всё его содержимое удаляются из файловой системы.7071#### `name`7273Имя каталога можно получить из атрибута `name` возвращённого объекта. Когда возвращённый объект используется как [менеджер контекста](https://python-all.ru/3.11/glossary.html#term-context-manager), значение `name` будет присвоено цели предложения `as` в операторе [`with`](https://python-all.ru/3.11/reference/compound_stmts.html#with), если оно есть.7475#### `cleanup()`7677Каталог можно явно очистить, вызвав метод `cleanup()`. Если *ignore\_cleanup\_errors* равно true, любые необработанные исключения во время явной или неявной очистки (например, [`PermissionError`](https://python-all.ru/3.11/library/exceptions.html#PermissionError) удаление открытых файлов в Windows) будут игнорироваться, а остальные удаляемые элементы будут удалены по принципу «насколько возможно». В противном случае ошибки будут возбуждаться в том контексте, где происходит очистка (вызов `cleanup()`, выход из менеджера контекста, когда объект удаляется сборщиком мусора или во время завершения интерпретатора).7879Вызывает [событие аудита](https://python-all.ru/3.11/library/sys.html#auditing) `tempfile.mkdtemp` с аргументом `fullpath`.8081Новое в версии 3.2.8283Изменено в версии 3.10: Добавлен параметр *ignore\_cleanup\_errors*.8485#### `tempfile.mkstemp(suffix=None, prefix=None, dir=None, text=False)`8687Создаёт временный файл наиболее безопасным способом. В процессе создания файла не возникает состояний гонки, если платформа правильно реализует флаг [`os.O_EXCL`](https://python-all.ru/3.11/library/os.html#os.O_EXCL) для [`os.open()`](https://python-all.ru/3.11/library/os.html#os.open). Файл доступен для чтения и записи только создавшему его пользователю. Если платформа использует биты разрешений для указания на исполняемость файла, то файл не является исполняемым никем. Файловый дескриптор не наследуется дочерними процессами.8889В отличие от [`TemporaryFile()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.TemporaryFile), пользователь [`mkstemp()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.mkstemp) отвечает за удаление временного файла после завершения работы с ним.9091Если *suffix* не равен `None`, имя файла будет заканчиваться на этот суффикс, иначе суффикса не будет. [`mkstemp()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.mkstemp) не ставит точку между именем файла и суффиксом; если она нужна, поместите её в начало *suffix*.9293Если *prefix* не равен `None`, имя файла будет начинаться с этого префикса; иначе используется префикс по умолчанию. По умолчанию берётся возвращаемое значение [`gettempprefix()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.gettempprefix) или [`gettempprefixb()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.gettempprefixb), в зависимости от ситуации.9495Если *dir* не равен `None`, файл будет создан в этом каталоге; иначе используется каталог по умолчанию. Каталог по умолчанию выбирается из списка, зависящего от платформы, но пользователь приложения может управлять расположением каталога, установив переменные окружения *TMPDIR*, *TEMP* или *TMP*. Поэтому нет гарантии, что сгенерированное имя файла будет обладать какими-либо полезными свойствами, например, не требовать экранирования при передаче внешним командам через `os.popen()`.9697Если любой из *suffix*, *prefix* и *dir* не равен `None`, они должны быть одного типа. Если они являются bytes, возвращаемое имя будет bytes, а не str. Если нужно принудительно получить bytes при остальных значениях по умолчанию, передайте `suffix=b''`.9899Если *text* указан и равен true, файл открывается в текстовом режиме. В противном случае (по умолчанию) файл открывается в бинарном режиме.100101[`mkstemp()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.mkstemp) возвращает кортеж, содержащий дескриптор открытого файла на уровне ОС (как возвращается [`os.open()`](https://python-all.ru/3.11/library/os.html#os.open)) и абсолютное имя пути к этому файлу, в указанном порядке.102103Вызывает [событие аудита](https://python-all.ru/3.11/library/sys.html#auditing) `tempfile.mkstemp` с аргументом `fullpath`.104105Изменено в версии 3.5: *suffix*, *prefix* и *dir* теперь могут передаваться в байтах для получения возвращаемого значения в байтах. Ранее допускалась только str. *suffix* и *prefix* теперь принимают и по умолчанию равны `None`, чтобы использовать подходящее значение по умолчанию.106107Изменено в версии 3.6: Параметр *dir* теперь принимает [path-like object](https://python-all.ru/3.11/glossary.html#term-path-like-object).108109#### `tempfile.mkdtemp(suffix=None, prefix=None, dir=None)`110111Создаёт временный каталог максимально безопасным способом. В создании каталога нет состояний гонки. Каталог доступен для чтения, записи и поиска только создавшему его пользователю.112113Пользователь [`mkdtemp()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.mkdtemp) отвечает за удаление временного каталога и его содержимого после использования.114115Аргументы *prefix*, *suffix* и *dir* такие же, как для [`mkstemp()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.mkstemp).116117[`mkdtemp()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.mkdtemp) возвращает абсолютный путь к новому каталогу, если *dir* равно `None` или является абсолютным путём. Если *dir* – относительный путь, [`mkdtemp()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.mkdtemp) возвращает относительный путь в Python 3.11 и ниже. Однако начиная с версии 3.12 во всех случаях будет возвращаться абсолютный путь.118119Вызывает [событие аудита](https://python-all.ru/3.11/library/sys.html#auditing) `tempfile.mkdtemp` с аргументом `fullpath`.120121Изменено в версии 3.5: *suffix*, *prefix* и *dir* теперь могут передаваться в байтах для получения возвращаемого значения в байтах. Ранее допускалась только str. *suffix* и *prefix* теперь принимают и по умолчанию равны `None`, чтобы использовать подходящее значение по умолчанию.122123Изменено в версии 3.6: Параметр *dir* теперь принимает [path-like object](https://python-all.ru/3.11/glossary.html#term-path-like-object).124125#### `tempfile.gettempdir()`126127Возвращает имя каталога, используемого для временных файлов. Оно определяет значение по умолчанию для аргумента *dir* во всех функциях этого модуля.128129Python просматривает стандартный список каталогов, чтобы найти тот, в котором вызывающий пользователь может создавать файлы. Список:1301311. Каталог, заданный переменной окружения `TMPDIR`.1322. Каталог, заданный переменной окружения `TEMP`.1333. Каталог, заданный переменной окружения `TMP`.1344. Расположение, зависящее от платформы:135136   - В Windows – каталоги `C:\TEMP`, `C:\TMP`, `\TEMP` и `\TMP` в указанном порядке.137   - На всех остальных платформах – каталоги `/tmp`, `/var/tmp` и `/usr/tmp` в указанном порядке.1385. В крайнем случае – текущий рабочий каталог.139140Результат этого поиска кэшируется; см. описание [`tempdir`](https://python-all.ru/3.11/library/tempfile.html#tempfile.tempdir) ниже.141142Изменено в версии 3.10: Теперь всегда возвращает str. Ранее возвращал любое значение [`tempdir`](https://python-all.ru/3.11/library/tempfile.html#tempfile.tempdir) независимо от типа, если оно не было `None`.143144#### `tempfile.gettempdirb()`145146То же, что [`gettempdir()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.gettempdir), но возвращаемое значение в байтах.147148Новое в версии 3.5.149150#### `tempfile.gettempprefix()`151152Возвращает префикс имени файла, используемый для создания временных файлов. Он не содержит компонента каталога.153154#### `tempfile.gettempprefixb()`155156То же, что [`gettempprefix()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.gettempprefix), но возвращаемое значение в байтах.157158Новое в версии 3.5.159160Модуль использует глобальную переменную для хранения имени каталога, используемого для временных файлов, который возвращается [`gettempdir()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.gettempdir). Её можно задать напрямую, чтобы переопределить процесс выбора, но это не рекомендуется. Все функции этого модуля принимают аргумент *dir*, который можно использовать для указания каталога. Это рекомендуемый подход, так как он не удивляет другой код, не ожидающий изменения глобального поведения API.161162#### `tempfile.tempdir`163164Если задано значение, отличное от `None`, эта переменная определяет значение по умолчанию для аргумента *dir* функций, определённых в этом модуле, включая его тип (bytes или str). Она не может быть [path-like object](https://python-all.ru/3.11/glossary.html#term-path-like-object).165166Если `tempdir` равно `None` (значение по умолчанию) при любом вызове любой из перечисленных выше функций, кроме [`gettempprefix()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.gettempprefix), она инициализируется по алгоритму, описанному в [`gettempdir()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.gettempdir).167168> **Примечание**169>170> Имейте в виду: если присвоить `tempdir` значение типа bytes, возникает неприятный побочный эффект: глобальный возвращаемый тип по умолчанию для [`mkstemp()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.mkstemp) и [`mkdtemp()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.mkdtemp) меняется на bytes, если не указаны явные аргументы `prefix`, `suffix` или `dir` типа str. Пожалуйста, не пишите код, который рассчитывает или полагается на это. Это неудобное поведение сохраняется для совместимости с исторической реализацией.171172## Примеры173174Вот несколько примеров типичного использования модуля [`tempfile`](https://python-all.ru/3.11/library/tempfile.html#module-tempfile):175176```python177>>> import tempfile178179# create a temporary file and write some data to it180>>> fp = tempfile.TemporaryFile()181>>> fp.write(b'Hello world!')182# read data from file183>>> fp.seek(0)184>>> fp.read()185b'Hello world!'186# close the file, it will be removed187>>> fp.close()188189# create a temporary file using a context manager190>>> with tempfile.TemporaryFile() as fp:191...     fp.write(b'Hello world!')192...     fp.seek(0)193...     fp.read()194b'Hello world!'195>>>196# file is now closed and removed197198# create a temporary directory using the context manager199>>> with tempfile.TemporaryDirectory() as tmpdirname:200...     print('created temporary directory', tmpdirname)201>>>202# directory and contents have been removed203```204205## Устаревшие функции и переменные206207Раньше для создания временных файлов сначала генерировали имя с помощью функции [`mktemp()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.mktemp), а затем создавали файл с этим именем. К сожалению, это небезопасно, так как другой процесс может создать файл с таким именем в промежутке между вызовом [`mktemp()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.mktemp) и последующей попыткой первого процесса создать файл. Решение – объединить два шага и создавать файл сразу. Этот подход используется в [`mkstemp()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.mkstemp) и других описанных выше функциях.208209#### `tempfile.mktemp(suffix='', prefix='tmp', dir=None)`210211Устарело с версии 2.3: Используйте [`mkstemp()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.mkstemp) вместо.212213Возвращает абсолютное имя пути к файлу, который не существовал на момент вызова. Аргументы *prefix*, *suffix* и *dir* аналогичны аргументам [`mkstemp()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.mkstemp), за исключением того, что имена файлов в байтах, `suffix=None` и `prefix=None` не поддерживаются.214215> **Предупреждение**216>217> Использование этой функции может привести к дыре в безопасности программы. К тому моменту, когда вы начнёте что-либо делать с возвращённым именем файла, кто-то другой может вас опередить. Использование [`mktemp()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.mktemp) можно легко заменить на [`NamedTemporaryFile()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.NamedTemporaryFile), передав ему параметр `delete=False`:218>219> ```python220> >>> f = NamedTemporaryFile(delete=False)221> >>> f.name222> '/tmp/tmptjujjt'223> >>> f.write(b"Hello World!\n")224> 13225> >>> f.close()226> >>> os.unlink(f.name)227> >>> os.path.exists(f.name)228> False229> ```230