Как читать текстовые файлы в 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'))