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

tempfile.md

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

1> **Источник:** https://python-all.ru/3.0/library/tempfile.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `tempfile` – Генерация временных файлов и каталогов89Этот модуль генерирует временные файлы и каталоги. Он работает на всех поддерживаемых платформах. В нем появились три новые функции: [`NamedTemporaryFile()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.NamedTemporaryFile), [`mkstemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkstemp) и [`mkdtemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkdtemp), которые должны полностью устранить необходимость в небезопасной функции [`mktemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mktemp). Имена временных файлов, создаваемых этим модулем, больше не содержат идентификатор процесса; вместо этого используется строка из шести случайных символов.1011Кроме того, все вызываемые пользователем функции теперь принимают дополнительные аргументы, позволяющие напрямую управлять расположением и именем временных файлов. Больше нет необходимости использовать глобальные переменные *tempdir* и *template*. Для сохранения обратной совместимости порядок аргументов несколько необычен; рекомендуется использовать именованные аргументы для ясности.1213Модуль определяет следующие функции, которые могут вызываться пользователем:1415#### `[tempfile.TemporaryFile]tempfile.TemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None]]]]])`1617Возвращает объект, похожий на файл, который можно использовать в качестве временного хранилища. Файл создаётся с помощью [`mkstemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkstemp). Он будет уничтожен сразу после закрытия (включая неявное закрытие при сборке мусора). Под Unix запись о файле в каталоге удаляется сразу после создания файла. Другие платформы этого не поддерживают; код не должен полагаться на то, что временный файл, созданный этой функцией, имеет или не имеет видимого имени в файловой системе.1819Параметр *mode* по умолчанию равен `'w+b'`, чтобы созданный файл можно было читать и записывать без закрытия. Используется двоичный режим, чтобы он вёл себя одинаково на всех платформах независимо от хранимых данных. *bufsize* по умолчанию равен `-1`, то есть используется значение по умолчанию операционной системы.2021Параметры *dir*, *prefix* и *suffix* передаются в [`mkstemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkstemp).2223Возвращаемый объект является настоящим файловым объектом на платформах POSIX. На других платформах это объект, подобный файлу, атрибут `file` которого является базовым настоящим файловым объектом. Этот объект, подобный файлу, можно использовать в операторе [`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with), как обычный файл.2425#### `[tempfile.NamedTemporaryFile]tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]])`2627Эта функция работает точно так же, как2829[`TemporaryFile()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.TemporaryFile)3031, за исключением того, что файл гарантированно имеет видимое имя в файловой системе (в Unix запись в каталоге не удаляется). Это имя можно получить из атрибута3233`name`3435объекта файла. Возможность использовать это имя для повторного открытия файла, пока временный файл ещё открыт, зависит от платформы (в Unix это возможно, в Windows NT и новее – нет). Если3637*delete*3839равно true (по умолчанию), файл удаляется сразу после закрытия. Возвращаемый объект всегда является файлоподобным объектом, атрибут4041`file`4243которого представляет собой настоящий файловый объект. Этот файлоподобный объект можно использовать в инструкции4445[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)4647, как обычный файл.4849#### `[tempfile.SpooledTemporaryFile]tempfile.SpooledTemporaryFile([max_size=0[, mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None]]]]]])`5051Эта функция работает точно так же, как [`TemporaryFile()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.TemporaryFile), за исключением того, что данные сохраняются в памяти, пока размер файла не превысит *max\_size* или пока не будет вызван метод `fileno()` файла; после этого содержимое записывается на диск, и работа продолжается как с [`TemporaryFile()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.TemporaryFile).5253Полученный файл имеет один дополнительный метод, `rollover()`, который вызывает переход файла на дисковый файл независимо от его размера.5455Возвращаемый объект является файлоподобным объектом, атрибут `_file` которого может быть либо объектом `StringIO`, либо настоящим файловым объектом, в зависимости от того, была ли вызвана `rollover()`. Этот файлоподобный объект можно использовать в инструкции [`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with), как обычный файл.5657#### `[tempfile.mkstemp]tempfile.mkstemp([suffix=''[, prefix='tmp'[, dir=None[, text=False]]]])`5859Создает временный файл максимально безопасным способом. При создании файла не возникает состояний гонки, если платформа правильно реализует флаг [`os.O_EXCL`](https://python-all.ru/3.0/library/os.html#os.O_EXCL) для [`os.open()`](https://python-all.ru/3.0/library/os.html#os.open). Файл доступен для чтения и записи только создавшему его пользователю (UID). Если платформа использует биты разрешений для указания исполняемости файла, файл неисполним никем. Файловый дескриптор не наследуется дочерними процессами.6061В отличие от [`TemporaryFile()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.TemporaryFile), пользователь [`mkstemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkstemp) отвечает за удаление временного файла после завершения работы с ним.6263Если указан *suffix*, имя файла будет заканчиваться этим суффиксом, в противном случае суффикса не будет. [`mkstemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkstemp) не ставит точку между именем файла и суффиксом; если она нужна, поместите её в начало *suffix*.6465Если указан *prefix*, имя файла будет начинаться с этого префикса; в противном случае используется префикс по умолчанию.6667Если указан *dir*, файл будет создан в этом каталоге; в противном случае используется каталог по умолчанию. Каталог по умолчанию выбирается из списка, зависящего от платформы, но пользователь приложения может управлять расположением каталога, задав переменные окружения *TMPDIR*, *TEMP* или *TMP*. Таким образом, нет гарантии, что сгенерированное имя файла будет обладать какими-либо удобными свойствами, например, не требовать экранирования при передаче внешним командам через `os.popen()`.6869Если указан параметр *text*, он определяет, открывать файл в двоичном режиме (по умолчанию) или в текстовом. На некоторых платформах это не имеет значения.7071[`mkstemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkstemp) возвращает кортеж, содержащий дескриптор открытого файла на уровне ОС (как бы вернул [`os.open()`](https://python-all.ru/3.0/library/os.html#os.open)) и абсолютный путь к этому файлу, в указанном порядке.7273#### `[tempfile.mkdtemp]tempfile.mkdtemp([suffix=''[, prefix='tmp'[, dir=None]]])`7475Создаёт временный каталог максимально безопасным способом. В создании каталога нет состояний гонки. Каталог доступен для чтения, записи и поиска только создавшему его пользователю.7677Пользователь [`mkdtemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkdtemp) отвечает за удаление временного каталога и его содержимого после завершения работы.7879Аргументы *prefix*, *suffix* и *dir* такие же, как для [`mkstemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkstemp).8081[`mkdtemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkdtemp) возвращает абсолютный путь к новому каталогу.8283#### `[tempfile.mktemp]tempfile.mktemp([suffix=''[, prefix='tmp'[, dir=None]]])`8485Устарело с версии 2.3: Вместо этого используйте [`mkstemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkstemp).8687Возвращает абсолютный путь к файлу, которого не существовало на момент вызова. Аргументы *prefix*, *suffix* и *dir* такие же, как у [`mkstemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkstemp).8889> **Предупреждение**90>91> Использование этой функции может привести к появлению уязвимости в вашей программе. К тому моменту, как вы соберетесь что-то делать с возвращённым именем файла, кто-то другой может вас опередить. Использование [`mktemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mktemp) можно легко заменить на [`NamedTemporaryFile()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.NamedTemporaryFile), передав ей параметр `delete=False`:92>93> ```python94> >>> f = NamedTemporaryFile(delete=False)95> >>> f96> <open file '<fdopen>', mode 'w+b' at 0x384698>97> >>> f.name98> '/var/folders/5q/5qTPn6xq2RaWqk+1Ytw3-U+++TI/-Tmp-/tmpG7V1Y0'99> >>> f.write("Hello World!\n")100> >>> f.close()101> >>> os.unlink(f.name)102> >>> os.path.exists(f.name)103> False104> ```105106Модуль использует две глобальные переменные, которые указывают, как формировать временное имя. Они инициализируются при первом вызове любой из перечисленных выше функций. Вызывающий может изменить их, но это не рекомендуется; вместо этого используйте соответствующие аргументы функций.107108#### `[tempfile.tempdir]tempfile.tempdir`109110Если этой переменной присвоено значение, отличное от `None`, она определяет значение по умолчанию для аргумента *dir* всех функций, определённых в этом модуле.111112Если `tempdir` не задан или равен `None` при любом вызове любой из перечисленных выше функций, Python просматривает стандартный список каталогов и устанавливает *tempdir* равным первому каталогу, в котором вызвавший пользователь может создавать файлы. Список:1131141. Каталог, указанный переменной окружения **TMPDIR**.1152. Каталог, указанный переменной окружения **TEMP**.1163. Каталог, указанный переменной окружения **TMP**.1174. Расположение, зависящее от платформы:118119   - На Windows каталоги `C:\TEMP`, `C:\TMP`, `\TEMP` и `\TMP`, в указанном порядке.120   - На всех остальных платформах каталоги `/tmp`, `/var/tmp` и `/usr/tmp`, в указанном порядке.1215. В крайнем случае – текущий рабочий каталог.122123#### `[tempfile.gettempdir]tempfile.gettempdir()`124125Возвращает каталог, выбранный в данный момент для создания временных файлов. Если126127[`tempdir`](https://python-all.ru/3.0/library/tempfile.html#tempfile.tempdir)128129не равно130131`None`132133, эта функция просто возвращает его содержимое; в противном случае выполняется описанный выше поиск и возвращается результат.134135#### `[tempfile.gettempprefix]tempfile.gettempprefix()`136137Возвращает префикс имени файла, используемый для создания временных файлов. Он не содержит компонента каталога.138