Рубрики
Без рубрики

tempfile – объекты временной файловой системы

Автор оригинала: Doug Hellmann.

Цель:

Создайте временные объекты файловой системы.

Надежно создавая временные файлы с уникальными именами, поэтому они не могут быть догадаться кем-то, кто хочет сломать приложение или украсть данные, сложно. Модуль TEMPFILE обеспечивает несколько функций для безопасного создания ресурсов временных файловых систем. TRUENARYFILE () Откроется и возвращает неназванный файл, <код> NamedTemporaryFile () Открывает и возвращает именованный файл, <код> SPALEDTEMPORARYFILE содержит свой контент в памяти перед записью

Временные файлы

Приложения, которые нуждаются в временных файлах для хранения данных, без необходимости поделиться этим файлом с другими программами, должны использовать функцию TRUMANYFILEFILE () для создания файлов. Функция создает файл, а на платформах, где можно немедленно разбить его. Это делает невозможным для другой программы, чтобы найти или открыть файл, поскольку в таблице файловой системой нет ссылки. Файл, созданный TRUENARYFILEFILE () автоматически удален, когда он будет закрыт, будь то вызова BLACK () или с помощью API Context Manager и с Заявление.

tempfile_TemporaryFile.py

import os
import tempfile

print('Building a filename with PID:')
filename  '/tmp/guess_my_name.{}.txt'.format(os.getpid())
with open(filename, 'w+b') as temp:
    print('temp:')
    print('  {!r}'.format(temp))
    print('temp.name:')
    print('  {!r}'.format(temp.name))

# Clean up the temporary file yourself.
os.remove(filename)

print()
print('TemporaryFile:')
with tempfile.TemporaryFile() as temp:
    print('temp:')
    print('  {!r}'.format(temp))
    print('temp.name:')
    print('  {!r}'.format(temp.name))

# Automatically cleans up the file.

Этот пример иллюстрирует разницу в создании временного файла, используя общий шаблон для содействия имени, по сравнению с использованием функции TRUENARYFILE () . Файл, возвращенный TRUENARYFILE () не имеет имя.

$ python3 tempfile_TemporaryFile.py

Building a filename with PID:
temp:
  <_io.BufferedRandom>
temp.name:
  '/tmp/guess_my_name.12151.txt'

TemporaryFile:
temp:
  <_io.BufferedRandom name=4>
temp.name:
  4

По умолчанию дескриптор файлов создается с помощью Mode 'W + B' , поэтому он ведет себя последовательно на всех платформах, и вызывающий абонент может написать ему и прочитать из него.

tempfile_TemporaryFile_binary.py

import os
import tempfile

with tempfile.TemporaryFile() as temp:
    temp.write(b'Some data')

    temp.seek(0)
    print(temp.read())

После написания дескриптор файлов должен быть «перемотан», используя SEECH () для того, чтобы прочитать данные от него.

$ python3 tempfile_TemporaryFile_binary.py

b'Some data'

Чтобы открыть файл в текстовом режиме, установите режим <код> на <код> ‘w + t’ , когда файл создан.

tempfile_TemporaryFile_text.py

import tempfile

with tempfile.TemporaryFile(mode'w+t') as f:
    f.writelines(['first\n', 'second\n'])

    f.seek(0)
    for line in f:
        print(line.rstrip())

Ручка файла обрабатывает данные в виде текста.

$ python3 tempfile_TemporaryFile_text.py

first
second

Названные файлы

Существуют ситуации, где важны именованный временный файл. Для приложений охватывает несколько процессов или даже хостов, название файла, является самым простым способом передачи его между частями приложения. Функция NamedTemporaryFile () создает файл без снимая его, поэтому он сохраняет его имя (доступ с Name атрибут).

tempfile_NamedTemporaryFile.py

import os
import pathlib
import tempfile

with tempfile.NamedTemporaryFile() as temp:
    print('temp:')
    print('  {!r}'.format(temp))
    print('temp.name:')
    print('  {!r}'.format(temp.name))

    f  pathlib.Path(temp.name)

print('Exists after close:', f.exists())

Файл удален после закрытия ручки.

$ python3 tempfile_NamedTemporaryFile.py

temp:
  
temp.name:
  '/var/folders/5q/8gk0wq888xlggz008k8dr7180000hg/T/tmps4qh5zde'
Exists after close: False

Буферные файлы

Для временных файлов, содержащих относительно небольшое количество данных, вполне вероятно, будет более эффективным использовать SPALEDTEMPRARYFILE , потому что он содержит содержимое файла в памяти, используя <код> IO.BYTESIO или io.stringio буфер, пока они не достигнут порогового размера. Когда объем данных передает пороговое значение, он «прокат» и записан на диск, а затем буфер заменяется нормальным <кодом> временной () .

tempfile_SpooledTemporaryFile.py

import tempfile

with tempfile.SpooledTemporaryFile(max_size100,
                                   mode'w+t',
                                   encoding'utf-8') as temp:
    print('temp: {!r}'.format(temp))

    for i in range(3):
        temp.write('This line is repeated over and over.\n')
        print(temp._rolled, temp._file)

Этот пример использует частные атрибуты SPALEDTEMPORAFILEFILE , чтобы определить, когда произошел ролик на диск. Обычно не нужно проверять этот статус, за исключением настройки размера буфера.

$ python3 tempfile_SpooledTemporaryFile.py

temp: 
False <_io.StringIO object at 0x1007a3d38>
False <_io.StringIO object at 0x1007a3d38>
True <_io.TextIOWrapper name=4>

Чтобы явно привести к записанию буфера на диск, вызовите <код> Rollover () или Fileno () методы.

tempfile_SpooledTemporaryFile_explicit.py

import tempfile

with tempfile.SpooledTemporaryFile(max_size1000,
                                   mode'w+t',
                                   encoding'utf-8') as temp:
    print('temp: {!r}'.format(temp))

    for i in range(3):
        temp.write('This line is repeated over and over.\n')
        print(temp._rolled, temp._file)
    print('rolling over')
    temp.rollover()
    print(temp._rolled, temp._file)

В этом примере, потому что размер буфера намного больше, чем объем данных, файл не будет создан на диске, за исключением того, что <код> Rollover () был вызван.

$ python3 tempfile_SpooledTemporaryFile_explicit.py

temp: 
False <_io.StringIO object at 0x1007a3d38>
False <_io.StringIO object at 0x1007a3d38>
False <_io.StringIO object at 0x1007a3d38>
rolling over
True <_io.TextIOWrapper name=4>

Временные каталоги

Когда необходимы несколько временных файлов, может быть удобнее создать один временный каталог с TRAMARYDirectory и открыть все файлы в этом каталоге.

tempfile_TemporaryDirectory.py

import pathlib
import tempfile

with tempfile.TemporaryDirectory() as directory_name:
    the_dir  pathlib.Path(directory_name)
    print(the_dir)
    a_file  the_dir / 'a_file.txt'
    a_file.write_text('This file is deleted.')

print('Directory exists after?', the_dir.exists())
print('Contents after:', list(the_dir.glob('*')))

Диспетчер контекста производит имя каталога, которое затем может использоваться в блоке контекста, чтобы построить другие имена файлов.

$ python3 tempfile_TemporaryDirectory.py

/var/folders/5q/8gk0wq888xlggz008k8dr7180000hg/T/tmp_urhiioj
Directory exists after? False
Contents after: []

Прогнозировать имена

В то время как менее безопасны, чем строго анонимные временные файлы, включая предсказуемую часть во имя имени позволяет найти файл и изучить его для целей отладки. Все функции, описанные до сих пор, возьмите три аргумента, чтобы контролировать имена имена файлов. Имена генерируются с использованием формулы:

dir + prefix + random + suffix

Все значения, кроме <Код> Случайный могут быть переданы как аргументы функциям для создания временных файлов или каталогов.

tempfile_NamedTemporaryFile_args.py

import tempfile

with tempfile.NamedTemporaryFile(suffix'_suffix',
                                 prefix'prefix_',
                                 dir'/tmp') as temp:
    print('temp:')
    print('  ', temp)
    print('temp.name:')
    print('  ', temp.name)

префикс и sugments аргументы сочетаются со случайной строкой символов для создания имени файла, а также аргумент dir как местоположение нового файла.

$ python3 tempfile_NamedTemporaryFile_args.py

temp:
   
temp.name:
   /tmp/prefix_q6wd5czl_suffix

Временное местоположение файла

Если явное назначение не дано с использованием аргумента Dir , путь, используемый для временных файлов, будет варьироваться в зависимости от текущей платформы и настройки. Модуль TEMPFILE включает в себя две функции для запроса параметров, используемых во время выполнения.

tempfile_settings.py

import tempfile

print('gettempdir():', tempfile.gettempdir())
print('gettempprefix():', tempfile.gettempprefix())

<Код> getTempdir () Возвращает каталог по умолчанию, который будет держать все временные файлы и <код> getTemppix () возвращает префикс строки для новых имен файлов и каталогов.

$ python3 tempfile_settings.py

gettempdir(): /var/folders/5q/8gk0wq888xlggz008k8dr7180000hg/T
gettempprefix(): tmp

Значение, возвращенное gettempdir () устанавливается на основе простого алгоритма просмотрения списка локаций для первого места. Текущий процесс может создать файл. Список поиска:

  1. П
  2. е
  3. р
  4. е
  5. м
  6. е
  7. н
  8. н
  9. а
  10. я
  11. с
  12. р
  13. е
  14. д
  15. ы
  16. <
  17. К
  18. о
  19. д
  20. >
  21. T
  22. M
  23. P
  24. D
  25. I
  26. R
  27. <
  28. /
  29. к
  30. о
  31. д
  32. >
  33. П
  34. е
  35. р
  36. е
  37. м
  38. е
  39. н
  40. н
  41. а
  42. я
  43. с
  44. р
  45. е
  46. д
  47. ы
  48. <
  49. К
  50. о
  51. д
  52. >
  53. T
  54. e
  55. m
  56. p
  57. <
  58. /
  59. к
  60. о
  61. д
  62. >
  63. П
  64. е
  65. р
  66. е
  67. м
  68. е
  69. н
  70. н
  71. а
  72. я
  73. с
  74. р
  75. е
  76. д
  77. ы
  78. <
  79. К
  80. о
  81. д
  82. >
  83. T
  84. M
  85. P
  86. <
  87. /
  88. к
  89. о
  90. д
  91. >
  92. З
  93. а
  94. п
  95. а
  96. с
  97. ,
  98. н
  99. а
  100. о
  101. с
  102. н
  103. о
  104. в
  105. е
  106. п
  107. л
  108. а
  109. т
  110. ф
  111. о
  112. р
  113. м
  114. ы
  115. .
  116. (
  117. W
  118. i
  119. n
  120. d
  121. o
  122. w
  123. s
  124. и
  125. с
  126. п
  127. о
  128. л
  129. ь
  130. з
  131. у
  132. е
  133. т
  134. п
  135. е
  136. р
  137. в
  138. ы
  139. й
  140. д
  141. о
  142. с
  143. т
  144. у
  145. п
  146. н
  147. ы
  148. й
  149. <
  150. к
  151. о
  152. д
  153. >
  154. C
  155. :
  156. \
  157. T
  158. e
  159. m
  160. p
  161. <
  162. /
  163. к
  164. о
  165. д
  166. >
  167. ,
  168. <
  169. к
  170. о
  171. д
  172. >
  173. C
  174. :
  175. \
  176. T
  177. M
  178. P
  179. <
  180. /
  181. к
  182. о
  183. д
  184. >
  185. ,
  186. <
  187. к
  188. о
  189. д
  190. >
  191. \
  192. t
  193. e
  194. m
  195. p
  196. <
  197. /
  198. к
  199. о
  200. д
  201. >
  202. и
  203. л
  204. и
  205. <
  206. к
  207. о
  208. д
  209. >
  210. \
  211. t
  212. m
  213. p
  214. <
  215. /
  216. c
  217. o
  218. d
  219. e
  220. >
  221. .
  222. Д
  223. р
  224. у
  225. г
  226. и
  227. е
  228. п
  229. л
  230. а
  231. т
  232. ф
  233. о
  234. р
  235. м
  236. ы
  237. и
  238. с
  239. п
  240. о
  241. л
  242. ь
  243. з
  244. у
  245. ю
  246. т
  247. <
  248. к
  249. о
  250. д
  251. >
  252. /
  253. t
  254. m
  255. p
  256. <
  257. /
  258. c
  259. o
  260. d
  261. e
  262. >
  263. ,
  264. <
  265. к
  266. о
  267. д
  268. >
  269. /
  270. v
  271. a
  272. r
  273. /
  274. t
  275. m
  276. p
  277. <
  278. /
  279. c
  280. o
  281. d
  282. e
  283. >
  284. и
  285. л
  286. и
  287. <
  288. к
  289. о
  290. д
  291. >
  292. /
  293. u
  294. s
  295. r
  296. /
  297. t
  298. m
  299. p
  300. <
  301. /
  302. c
  303. o
  304. d
  305. e
  306. >
  307. .
  308. )
  309. Е
  310. с
  311. л
  312. и
  313. д
  314. р
  315. у
  316. г
  317. о
  318. й
  319. к
  320. а
  321. т
  322. а
  323. л
  324. о
  325. г
  326. н
  327. е
  328. м
  329. о
  330. ж
  331. е
  332. т
  333. б
  334. ы
  335. т
  336. ь
  337. н
  338. а
  339. й
  340. д
  341. е
  342. н
  343. ,
  344. т
  345. е
  346. к
  347. у
  348. щ
  349. и
  350. й
  351. р
  352. а
  353. б
  354. о
  355. ч
  356. и
  357. й
  358. к
  359. а
  360. т
  361. а
  362. л
  363. о
  364. г
  365. и
  366. с
  367. п
  368. о
  369. л
  370. ь
  371. з
  372. у
  373. е
  374. т
  375. с
  376. я
  377. .

tempfile_tempdir.py

import tempfile

tempfile.tempdir  '/I/changed/this/path'
print('gettempdir():', tempfile.gettempdir())

Программы, которые должны использовать глобальное место для всех временных файлов без использования каких-либо из этих переменных среды, должны устанавливать <код> tempfile.tempdir непосредственно путем назначения значения переменной.

$ python3 tempfile_tempdir.py

gettempdir(): /I/changed/this/path

Смотрите также