На этом шаге мы рассмотрим основные возможности модуля tempfile.
Вам нужно создать временный файл или каталог, которые будут использоваться во время выполнения вашей программы. После, возможно, вы захотите, чтобы
они были удалены.
В модуле tempfile есть различные функции, которые помогут решить эту задачу. Чтобы создать безымянный временный файл, используйте tempfile.TemporaryFile:
from tempfile import TemporaryFile with TemporaryFile('w+t') as f: # Чтение/запись в файл f.write('Hello World\n') f.write('Testing\n') # Перейти в начало и прочесть данные f.seek(0) data = f.read() # Временный файл уничтожен
Также вы можете использовать файл таким образом:
f = TemporaryFile('w+t') # Использовать временный файл . . . f.close() # Файл уничтожен
Первый аргумент, передаваемый в TemporaryFile(), - это режим файла: обычно для текстовых файлов это w+t, а для бинарных - w+b. Этот режим одновременно поддерживает чтение и запись, что в данном случае полезно, поскольку закрытие файла для смены режима разрушило бы его. TemporaryFile() дополнительно принимает те же аргументы, что и встроенная функция open(). Например:
with TemporaryFile('w+t', encoding='utf-8', errors='ignore') as f: . . .
На большинстве Unix-систем файл, созданный функцией TemporaryFile(), является безымянным и даже не имеет местоположения в каталоге. Если вы хотите преодолеть это ограничение, используйте NamedTempomryFile(). Например:
from tempfile import NamedTemporaryFile with NamedTemporaryFile('w+t') as f: print('filename is:', f.name) . . . # Файл автоматически уничтожается
Здесь атрибут f.name открытого файла содержит имя временного файла. Это может быть полезно, если оно передается какой-то другой программе, которой нужно будет открыть этот файл. Как и в случае TemporaryFile(), получившийся файл будет автоматически уничтожен после закрытия. Если вы не хотите, чтобы это произошло, передайте в функцию именованный аргумент delete=False. Например:
with NamedTemporaryFile('w+t', delete=False) as f: print('filename is:', f.name) . . .
Чтобы создать временный каталог, используйте tempfile.TemporaryDirectory(). Например:
from tempfile import TemporaryDirectory with TemporaryDirectory() as dirname: print('dirname is:', dirname) # Использовать каталог . . . # Каталог и все его содержимое уничтожается
Функции TemporaryFile(), NamedTempomryFile() и TemporaryDirectory() - вероятно, самый удобный способ работы с временными файлами и каталогами, потому что они автоматически управляются со всеми шагами создания и последующей чистки. На низком уровне вы также можете использовать mkstemp() и mkdtemp() для создания временных файлов и каталогов:
>>> import tempfile >>> tempfile.mkstemp() (3, 'C:\\Temp\\tmpe61c5mu6') >>> tempfile.mkdtemp() 'C:\\Temp\\tmpsu15zlg3' >>>
Однако эти функции не заботятся о последующем управлении. Например, функция mkstemp() просто возвращает сырой файловый дескриптор операционной системы и оставляет всю работу по превращению его в настоящий файл вам. Похожим образом вам нужно самостоятельно удалять файлы.
Обычно временные файлы создаются в определенном операционной системой месте сохранения по умолчанию, таком как /tmp и т. п. Чтобы получить путь, используйте функцию tempfile.gettempdir(). Например:
>>> tempfile.gettempdir()
'C:\\Temp'
>>>
Все функции, связанные с временными файлами, позволяют вам менять этот каталог и принципы именования файлов с помощью именованных аргументов prefix, suffix и dir. Например:
>>> f = tempfile.NamedTemporaryFile(prefix='mytemp', suffix='.txt', dir='C:\\Temp') >>> f.name 'C:\\Temp\\mytemp1zodtg6a.txt' >>>
И последнее: модуль tempfile создает временные файлы наиболее безопасным способом из всех возможных. Это включает предоставление доступа только текущему пользователю и предпринятие шагов, предотвращающих состояние гонки (race condition) при создании файлов. Однако стоит знать, что на различных платформах этот модуль работает по-разному. Чтобы уточнить свое понимание, обратитесь к официальной документации.
https://docs.python.org/3/library/tempfile.html.
На следующем шаге мы рассмотрим работу с последовательными портами.