Прочитайте большой текстовый файл в молнии в строке в python

Я пытаюсь использовать модуль zipfile для чтения файла в архиве. несжатый файл ~ 3 ГБ, а сжатый файл - 200 МБ. Я не хочу, чтобы они были в памяти, когда я обрабатываю сжатый файл по строкам. До сих пор я заметил чрезмерное использование памяти, используя следующий код:

import zipfile
f = open(...)
z = zipfile.ZipFile(f)
for line in zipfile.open(...).readlines()
  print line

Я сделал это на С# с помощью SharpZipLib:

var fStream = File.OpenRead("...");
var unzipper = new ICSharpCode.SharpZipLib.Zip.ZipFile(fStream);
var dataStream =  unzipper.GetInputStream(0);

dataStream несжатый. Я не могу найти способ сделать это в Python. Помощь будет оценена.

Ответы

Ответ 1

Файловые объекты Python предоставляют итераторы, которые будут читаться последовательно. file.readlines() читает их все и возвращает список, что означает, что ему нужно все прочитать в памяти. Лучший подход (который всегда должен быть предпочтительнее readlines()) - просто перебрать сам объект, например:

import zipfile
with zipfile.ZipFile(...) as z:
    with z.open(...) as f:
        for line in f:
            print line

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