Как читать текстовые файлы в ZIP-папке в Python

У меня есть сжатый файл данных (все в папке, затем в архиве). Я хочу прочитать каждый файл без разархивирования. Я пробовал несколько способов, но ничего не работает для ввода папки в zip-файле. Как мне этого добиться?

Без папки в zip-файле:

with zipfile.ZipFile('data.zip') as z:
  for filename in z.namelist():
     data = filename.readlines()

С одной папкой:

with zipfile.ZipFile('data.zip') as z:
      for filename in z.namelist():
         if filename.endswith('/'):
             # Here is what I was stucked

3 ответа

Решение

namelist() возвращает список всех элементов в архиве рекурсивно.

Вы можете проверить, является ли элемент каталогом, вызвав os.path.isdir ():

import os
import zipfile

with zipfile.ZipFile('archive.zip') as z:
    for filename in z.namelist():
        if not os.path.isdir(filename):
            # read the file
            with z.open(filename) as f:
                for line in f:
                    print line

Надеюсь, это поможет.

Я получил код Алека на работу. Я сделал несколько небольших правок: (обратите внимание, это не будет работать с zip-файлами, защищенными паролем)

import os
import sys
import zipfile

z = zipfile.ZipFile(sys.argv[1])  # Flexibility with regard to zipfile

for filename in z.namelist():
    if not os.path.isdir(filename):
        # read the file
        for line in z.open(filename):
            print line
        z.close()                # Close the file after opening it
del z                            # Cleanup (in case there's further work after this)

У меня есть код RichS для работы. Я внес небольшие правки:

      import os
import sys
import zipfile

archive = sys.argv[1] # assuming launched with `python my_script.py archive.zip`

with zipfile.ZipFile(archive) as z:    
    for filename in z.namelist():
        if not os.path.isdir(filename):
            # read the file
            for line in z.open(filename):
                print(line.decode('utf-8'))

Как видите, правки незначительны. Я переключился на Python 3, в классе ZipFile есть заглавная буква F, а результат конвертируется из b-строк в строки Unicode. Декодируйте только в том случае, если вы пытаетесь распаковать текстовый файл.

PS Я совершенно не осуждаю RichS. Я просто подумал, что это будет весело. И полезный, и легкий хренпост.PPS Вы можете получить файл из архива с паролем: ZipFile.open(name, mode='r', pwd=None, *, force_zip64=False) или же ZipFile.read(name, pwd=None). Если вы используете .read тогда нет диспетчера контекста, поэтому вы просто сделаете

                  # read the file
            print(z.read(filename).decode('utf-8'))
Другие вопросы по тегам