Модуль Python tempfile
Вступление
Временные файлы, или “временные файлы”, в основном используются для хранения промежуточной информации на диске для приложения. Эти файлы обычно создаются для различных целей, таких как временное резервное копирование или если приложение имеет дело с большим набором данных, превышающим объем памяти системы, и т. Д. В идеале эти файлы находятся в отдельном каталоге, который варьируется в разных операционных системах, и имена этих файлов уникальны. Данные, хранящиеся во временных файлах, не всегда требуются после завершения работы приложения, поэтому вы можете захотеть, чтобы эти файлы были удалены после использования.
Создание временного файла
Давайте взглянем на приведенную ниже программу Python, чтобы увидеть, как она работает:
Он напечатает нижеприведенный вывод:
Создайте именованный временный файл
Запуск этого кода приведет к печати вывода, аналогичного следующему:
Предоставление суффикса или префикса к имени
Иногда нам нужно добавить префикс или суффикс к имени временного файла. Это поможет нам идентифицировать все временные файлы, созданные нашей программой.
Запуск этого кода приведет к печати следующих выходных данных:
Поиск расположения временных файлов по умолчанию
Переменная tempfile.tempdir содержит расположение по умолчанию для всех временных файлов. Если значение tempdir равно None или unset, Python будет искать стандартный список каталогов и устанавливает tempdir в первое значение каталога, но только в том случае, если вызывающая программа может создать в нем файл. Ниже приведен список каталогов, которые он будет сканировать, в следующем порядке:
Если вы запустите приведенную выше программу, она выведет результат, подобный следующему:
Вы можете видеть, что первое местоположение временного каталога является системным местоположением каталога, а второе значение временного каталога совпадает с тем, которое мы определили.
Чтение и запись данных из временных файлов
Мы узнали, как создать временный файл, создать временный файл с именем и как создать временный файл с суффиксом и/или префиксом. Теперь давайте попробуем понять, как на самом деле читать и записывать данные из временного файла в Python.
Это выведет выходные данные как ‘hello world!’ так как метод write() принимает входные данные в байтах (отсюда и префикс b в строке).
В отличие от предыдущего примера, на выходе будет выведено “Hello World”.
Создание временного каталога
Он напечатает нижеприведенный вывод:
Создайте безопасный временный файл и каталог
Как вы можете видеть в приведенном ниже примере, пользователь несет ответственность за удаление файла.
Вывод
В этой статье мы изучили различные способы создания временных файлов и каталогов в Python. Вы можете использовать временные файлы в любой программе Python, которую вы хотите. Но просто убедитесь, что вы удалили его, если конкретный используемый метод не удаляет его автоматически сам по себе. Также имейте в виду, что поведение может отличаться в разных операционных системах, например, имена выходных каталогов и имена файлов.
Использование модуля tempfile в Python
В этой статье рассмотрим модуль из стандартной библиотеки для создания временных файлов и папок в Python.
Введение
Tempfile — это модуль из стандартной библиотеки, используемый для создания временных файлов и каталогов. Такие файлы очень удобны, когда мы не хотим хранить данные постоянно. Если мы работаем с массивными данными, то эти файлы создаются с уникальными именами и хранятся в месте по умолчанию, варьирующемся от вашей операционной системы. Например, в Windows папка temp находится в каталоге %ИМЯПОЛЬЗОВАТЕЛЯ%/AppData/Local/Temp, в то время как в иных системах папка временных файлов находится в других местах.
Создание временного файла
Вывод программы
Здесь мы видим, как создать временный файл с помощью функции tempfile(). Сначала мы импортировали модуль tempfile, после чего определили переменную и использовали нашу функцию для создания временного файла. После чего мы использовали оператор print 2 раза. Первый, чтобы получить объект нашего файла, а второй, чтобы получить точное имя файла. Имя файла генерируется случайным образом и может варьироваться от пользователя к пользователю.
Создание именованного временного файла
Вывод программы
Здесь мы создали именованный временный файл.
Разница, которая вполне очевидна, заключается в том, что вместо метода TemporaryFile() мы использовали NamedTemporaryFile().
В этом методе генерируется случайное имя для временного файла. Так же этот файл по умолчанию храниться в директории временных файлов вашей операционной системы.
Создание временного каталога
Вывод программы
Здесь мы создали каталог. Как мы видим, синтаксис изменился всего на один вызов по сравнению с тем, что мы использовали для создания временного файла. Здесь вместо метода TemporaryFile() мы использовали TemporaryDirectory().
Чтение и запись во временный файл
Вывод программы
Выше мы видим, как читать и записывать во временные файлы. Здесь мы впервые создали временный файл. После чего мы использовали функцию записи, которая используется для записи данных во временный файл. Наверное, вам интересно, что там делает ‘b’. Дело в том, что по умолчанию временные файлы берут на вход данные, и ‘b’ преобразует строку в двоичный файл.
Далее вызывается функция поиска, которая устанавливает указатель в файле на его начало. Затем мы использовали функцию чтения, которая читает содержимое временного файла.
Альтернативный способ с использованием mkstemp
Функция tempfile() великолепна, но в этом разделе мы рассмотрим одну из альтернатив. mkstemp() — это функция, которая делает все то же самое, но в дополнение к этому, она обеспечивает безопасность.
Только пользователь, создавший временный файл, может добавлять в него данные. Кроме того, этот файл автоматически не удаляется при закрытии.
Вывод программы
Здесь мы создали временный файл с помощью метода mkstemp(). Изменений относительно предыдущего примера минимально, вместо TemporaryFile() мы использовали mkstemp(), а все остальное осталось прежним.
Заключение
Сегодня мы рассмотрели как используется и для чего нужна библиотека tempfile в Python. Если у вас есть дополнительные вопросы, не стесняйтесь задавать их в комментариях.
tempfile — Генерация временных файлов и каталогов¶
Исходный код: Lib/tempfile.py
Все вызываемые пользователем функции и конструкторы принимают дополнительные аргументы, позволяющие непосредственно управлять расположением и именем временных файлов и каталогов. Имена файлов, используемый этим модулем, содержат строка случайных символов, что позволяет безопасно создавать эти файлы в общих временных каталогах. Для поддержания обратной совместимости порядок аргументов несколько странен; для ясности рекомендуется использовать ключевой аргументы.
Модуль определяет следующие вызываемые пользователем элементы:
tempfile. TemporaryFile ( mode=’w+b’, buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None ) ¶
Результирующий объект можно используемый как диспетчер контекст (см. Примеры ). По завершении контекст или уничтожения объекта файла временный файл будет удален из файловой системы.
Объект возвращенный является истинным файловым объектом на платформах POSIX. На других платформах это файлообразный объект, file атрибут которого является базовым истинным файловым объектом.
Флаг os.O_TMPFILE используемый, если он доступен и работает (для Linux требуется ядро Linux 3.11 или более поздней версии).
Изменено в версии 3.8: Добавлен errors параметр.
Изменено в версии 3.8: Добавлен параметр errors.
Изменено в версии 3.8: Добавлен errors параметр.
Имя каталога можно получить из name атрибут объекта возвращенный. Когда объект возвращенный будет используемый как менеджером контекст, name будет назначен на цель as клаузула в with инструкция, если будет тот.
Добавлено в версии 3.2.
Если задано значение text и true, файл открывается в текстовом режиме. В противном случае (по умолчанию) файл открывается в двоичном режиме.
mkstemp() возвращает кортеж, содержащий дескриптор уровня ОС, в открытый файл (как будет возвращенный os.open() ) и абсолютное имя пути этого файла в таком порядке.
Создает временный каталог максимально безопасным способом. В созданном каталоге отсутствуют условия гонки. Каталог доступен для чтения, записи и поиска только при создании идентификатора пользователя.
Пользователь mkdtemp() несет ответственность за удаление временного каталога и его содержимого по завершении работы с ним.
mkdtemp() возвращает абсолютное имя пути нового каталога.
Возвращает имя каталога, используемый для временных файлов. Это определяет значение по умолчанию для аргумента dir для всех функций в этом модуле.
Python ищет стандартный список каталогов для поиска каталога, в котором вызывающий пользователь может создавать файлы. Список:
Результат этого поиска кэшируется, см. описание tempdir ниже.
Добавлено в версии 3.5.
Возвращает создания временных файлов используемый префикс имени файла. Он не содержит компонент каталога.
Добавлено в версии 3.5.
Примеры¶
Ниже приведены некоторые примеры типичного использования модуля tempfile :
Устаревшие функции и переменные¶
Модуль Tempfile в Python
На всех языках программирования часто этой программе требуется сохранять временные данные в файловой системе, создавая временные каталоги и файлы. Эти данные могут быть не полностью готовы для вывода, но все же доступ к этим данным может принести в жертву уровень безопасности программы.
Написание полного кода для простого управления временными данными также является громоздким процессом. Это связано с тем, что нам нужно написать логику создания случайных имен для этих файлов и каталогов, а затем записи в них с последующим удалением данных после завершения всех операций.
Все эти шаги очень легко выполняются с помощью модуля tempfile в Python. Он предоставляет простые функции, с помощью которых мы можем создавать временные файлы и каталоги, а также легко получать к ним доступ. Давайте посмотрим здесь на этот модуль в действии.
Создание временных файлов
Когда нам нужно создать временный файл для хранения данных, нам нужна функция TemporaryFile(). Преимущество этой функции заключается в том, что когда она создает новый файл, в файловой системе платформы нет ссылок на файл, и поэтому другие программы не могут получить доступ к этим файлам.
Вот пример программы в Python, которая создает временный файл и очищает его при закрытии TemporaryFile:
Посмотрим на результат этой программы:
В первом фрагменте кода мы очищаем файл самостоятельно. В следующем фрагменте кода, как только TemporaryFile закрывается, файл также полностью удаляется из системы.
Запустив эту программу, вы увидите, что в файловой системе вашего компьютера нет файлов.
Чтение из временного файла
К счастью, чтение всех данных из временного файла – это всего лишь вызов одной функции. Благодаря этому мы можем читать данные, которые мы записываем в файл, не обрабатывая их побайтно и не выполняя сложных операций ввода-вывода.
Давайте посмотрим на фрагмент кода, чтобы продемонстрировать это:
Посмотрим на результат этой программы:
Нам нужно было только вызвать функцию read() для объекта TemporaryFile(), и мы смогли получить обратно все данные из временного файла. Наконец, обратите внимание, что мы записали в этот файл только байтовые данные. В следующем примере мы запишем в него данные в виде обычного текста.
Запись простого текста во временный файл
С небольшими изменениями в последней написанной нами программе мы также можем записывать простые текстовые данные во временный файл:
Посмотрим на результат этой программы:
Создание именованных временных файлов
Именованные временные файлы важны, потому что могут быть сценарии и приложения, которые охватывают несколько процессов или даже машин. Если мы назовем временный файл, его легко будет передавать между частями приложения.
Давайте посмотрим на фрагмент кода, который использует функцию NamedTemporaryFile() для создания именованного временного файла:
Посмотрим на результат этой программы:
Предоставление суффикса и префикса имени файла
Иногда нам нужно иметь некоторый префикс и суффикс в именах файлов, чтобы определить цель, которую выполняет файл. Таким образом, мы можем создать несколько файлов, чтобы их было легко идентифицировать в группе файлов о том, какой файл выполняет определенную цель.
Вот пример программы, которая предоставляет префикс и суффикс в имена файлов:
Посмотрим на результат этой программы:
Заключение
В этом уроке мы изучили, как можно безопасно создавать временные файлы в Python для наших программ и приложений. Мы также увидели, как мы можем создавать файлы, которые могут охватывать несколько процессов, и увидели, как мы можем предоставить суффикс префикса для имен файлов, чтобы они легко указывали, какие данные они содержат.
tempfile — Generate temporary files and directories¶
Source code: Lib/tempfile.py
All the user-callable functions and constructors take additional arguments which allow direct control over the location and name of temporary files and directories. Files names used by this module include a string of random characters which allows those files to be securely created in shared temporary directories. To maintain backward compatibility, the argument order is somewhat odd; it is recommended to use keyword arguments for clarity.
The module defines the following user-callable items:
The resulting object can be used as a context manager (see Examples ). On completion of the context or destruction of the file object the temporary file will be removed from the filesystem.
The returned object is a true file object on POSIX platforms. On other platforms, it is a file-like object whose file attribute is the underlying true file object.
The os.O_TMPFILE flag is used if it is available and works (Linux-specific, requires Linux kernel 3.11 or later).
Changed in version 3.5: The os.O_TMPFILE flag is now used if available.
Changed in version 3.8: Added errors parameter.
This function operates exactly as TemporaryFile() does, except that the file is guaranteed to have a visible name in the file system (on Unix, the directory entry is not unlinked). That name can be retrieved from the name attribute of the returned file-like object. Whether the name can be used to open the file a second time, while the named temporary file is still open, varies across platforms (it can be so used on Unix; it cannot on Windows NT or later). If delete is true (the default), the file is deleted as soon as it is closed. The returned object is always a file-like object whose file attribute is the underlying true file object. This file-like object can be used in a with statement, just like a normal file.
Changed in version 3.8: Added errors parameter.
The returned object is a file-like object whose _file attribute is either an io.BytesIO or io.TextIOWrapper object (depending on whether binary or text mode was specified) or a true file object, depending on whether rollover() has been called. This file-like object can be used in a with statement, just like a normal file.
Changed in version 3.3: the truncate method now accepts a size argument.
Changed in version 3.8: Added errors parameter.
The directory name can be retrieved from the name attribute of the returned object. When the returned object is used as a context manager, the name will be assigned to the target of the as clause in the with statement, if there is one.
The directory can be explicitly cleaned up by calling the cleanup() method. If ignore_cleanup_errors is true, any unhandled exceptions during explicit or implicit cleanup (such as a PermissionError removing open files on Windows) will be ignored, and the remaining removable items deleted on a “best-effort” basis. Otherwise, errors will be raised in whatever context cleanup occurs (the cleanup() call, exiting the context manager, when the object is garbage-collected or during interpreter shutdown).
Changed in version 3.10: Added ignore_cleanup_errors parameter.
If text is specified and true, the file is opened in text mode. Otherwise, (the default) the file is opened in binary mode.
mkstemp() returns a tuple containing an OS-level handle to an open file (as would be returned by os.open() ) and the absolute pathname of that file, in that order.
Changed in version 3.5: suffix, prefix, and dir may now be supplied in bytes in order to obtain a bytes return value. Prior to this, only str was allowed. suffix and prefix now accept and default to None to cause an appropriate default value to be used.
Creates a temporary directory in the most secure manner possible. There are no race conditions in the directory’s creation. The directory is readable, writable, and searchable only by the creating user ID.
The user of mkdtemp() is responsible for deleting the temporary directory and its contents when done with it.
mkdtemp() returns the absolute pathname of the new directory.
Changed in version 3.5: suffix, prefix, and dir may now be supplied in bytes in order to obtain a bytes return value. Prior to this, only str was allowed. suffix and prefix now accept and default to None to cause an appropriate default value to be used.
Return the name of the directory used for temporary files. This defines the default value for the dir argument to all functions in this module.
Python searches a standard list of directories to find one which the calling user can create files in. The list is:
The directory named by the TMPDIR environment variable.
The directory named by the TEMP environment variable.
The directory named by the TMP environment variable.
A platform-specific location:
As a last resort, the current working directory.
The result of this search is cached, see the description of tempdir below.
Same as gettempdir() but the return value is in bytes.
Return the filename prefix used to create temporary files. This does not contain the directory component.
Same as gettempprefix() but the return value is in bytes.
ExamplesВ¶
Here are some examples of typical usage of the tempfile module:
Deprecated functions and variablesВ¶
A historical way to create temporary files was to first generate a file name with the mktemp() function and then create a file using this name. Unfortunately this is not secure, because a different process may create a file with this name in the time between the call to mktemp() and the subsequent attempt to create the file by the first process. The solution is to combine the two steps and create the file immediately. This approach is used by mkstemp() and the other functions described above.
Deprecated since version 2.3: Use mkstemp() instead.




