Python Zipfile - весь файл распакован в память? - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть код, который я использую, чтобы открыть большой zip-файл, содержащий несколько csv-файлов, а затем проанализировать их.

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

def unzip_file(file_path):

    zip_ref = zipfile.ZipFile(file_path, 'r')

    extracted = zip_ref.namelist()

    zip_ref.extractall('/tmp/extracts')

    zip_ref.close()

    return extracted

Это фактически разархивирует файлы и их содержимое в память, а затем извлекает файлы прямо на диск? Впоследствии я использую переменную extracted, поскольку она содержит список имен файлов, которые мне нужно обработать, но я также не хочу открывать каждый файл в памяти и затем читать их снова.

1 Ответ

1 голос
/ 09 апреля 2019

Вы беспокоитесь о том, что вы тратите впустую память или неэффективны в том, как вы читаете файлы при их извлечении. Ответ, если вы делаете что-то «не так», просто: «Нет». Ваш код верен и не сохраняет файлы в памяти после завершения вызова функции.

Несколько замечаний о том, что вы можете улучшить.

Использование контекстных менеджеров для автоматического закрытия файла

ZipFile также является менеджером контекста, и, как правило, рекомендуется использовать его, чтобы убедиться, что файлы закрыты и правильно очищены из памяти. Вместо того, чтобы звонить .close() вручную, вы можете сделать следующее:

with ZipFile(file_path, "r") as zip_ref:
    zip_ref.extractall("/tmp/extracts")

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

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

Чтение файлов без распаковки

Поскольку вы извлекаете файлы в папку /tmp/, я думаю (?), Что вы на самом деле не хотите хранить файлы на диске. Возможно, все, что вы хотите сделать, это прочитать данные и что-то с ними сделать.

Вы можете прочитать каждый файл в zip-файле, не распаковывая их на диск.

with ZipFile('spam.zip') as myzip:
    with myzip.open('eggs.txt') as myfile:
        print(myfile.read())

Это может быть лучшим решением в зависимости от того, чего вы хотите достичь. Вы можете увидеть больше из документов Python .

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