Распаковать во временный (в памяти) каталог с помощью Python mkdtemp()?

Я просмотрел примеры и, похоже, не нашел подходящего.

Хотите разархивировать файл в памяти во временный каталог с помощью Python mkdtemp().

Что-то вроде этого кажется интуитивно понятным, но я не могу найти правильный синтаксис:

import zipfile
import tempfile


zf = zipfile.Zipfile('incoming.zip')

with tempfile.mkdtemp() as tempdir:
    zf.extractall(tempdir)

# do stuff on extracted files

Но это приводит к:

AttributeError                            Traceback (most recent call last)
<ipython-input-5-af39c866a2ba> in <module>
      1 zip_file = zipfile.ZipFile('incoming.zip')
      2 
----> 3 with tempfile.mkdtemp() as tempdir:
      4     zip_file.extractall(tempdir)

AttributeError: __enter__

person ericOnline    schedule 05.01.2021    source источник
comment
Вы не можете использовать .mkdtemp() с with и as. Он возвращает имя пути в виде строки, а не диспетчера контекста. Прочтите это – › Python: почему я получаю AttributeError: __enter__   -  person Mantas Kandratavičius    schedule 05.01.2021
comment
mkdtemp() не возвращает диспетчер контекста. Он возвращает путь. Вы должны справиться с этим вручную. И это также не работает в памяти, за исключением того, что ваш временный каталог находится на RAM-диске.   -  person Klaus D.    schedule 05.01.2021
comment
Вы ищете tempfile.TemporaryDirectory. менеджер контекста. Но на самом деле, в зависимости от того, что вы пытаетесь сделать, есть большая вероятность, что вам не нужно сначала распаковывать zip, чтобы сделать это.   -  person Ondrej K.    schedule 05.01.2021


Ответы (1)


Я уже упоминал в своем комментарии, почему код, который вы написали, не работает. .mkdtemp() возвращает просто путь в виде строки, но то, что вы действительно хочу иметь контекстный менеджер.

Вы можете легко исправить это, используя правильную функцию .TemporaryDirectory()

Эта функция безопасно создает временный каталог, используя те же правила, что и mkdtemp(). Полученный объект можно использовать в качестве менеджера контекста (см. примеры). По завершении контекста или уничтожении объекта временного каталога вновь созданный временный каталог и все его содержимое удаляются из файловой системы.


zf = zipfile.ZipFile('incoming.zip')

with tempfile.TemporaryDirectory() as tempdir:
    zf.extractall(tempdir)

Только это сработает

person Mantas Kandratavičius    schedule 05.01.2021
comment
Я был близок! Спасибо, что помогли мне пройти через это. Теперь у меня есть больше понимания (и домашнее задание). - person ericOnline; 05.01.2021