извлечение файлов из вложенных папок zip с помощью python zipfile

#python #pandas #zipfile

#python #pandas #python-zipfile

Вопрос:

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

 from io import BytesIO
import pandas as pd
import requests
import zipfile
url1 = 'https://www.someurl.com/abc.zip'
r = requests.get(url1)
z = zipfile.ZipFile(BytesIO(r.content))    
temp  = pd.read_csv(z.open('mno.csv')
 

мой вопрос в том, что, допустим, у меня есть дочерняя подпапка

 xyz.zip 
 

содержащий файл

 pqr.csv
 

как я могу прочитать этот файл

Ответ №1:

Используйте другой BytesIO объект, чтобы открыть содержащийся zip-файл

 from io import BytesIO
import pandas as pd
import requests
import zipfile

# Read outer zip file
url1 = 'https://www.someurl.com/abc.zip'
r = requests.get(url1)
z = zipfile.ZipFile(BytesIO(r.content))

# lets say the archive is:
#     zippped_folder/pqr.zip (which contains pqr.csv)

# Read contained zip file
pqr_zip = zipfile.ZipFile(BytesIO(z.open('zippped_folder/pqr.zip')))
temp = pd.read_csv(pqr_zip.open('prq.csv'))
 

Ответ №2:

Попробовав некоторую комбинацию перестановок, я решил проблему с этим кодом

 zz = zipfile.ZipFile(z.namelist()[i])
temp2  = pd.read_csv(zz.open('pqr.csv'))
# where i is the index position of the child zip folder in the namelist() list. In this case, the 'xyz.zip' folder

# for eg if the 'xyz.zip' folder was third in the list, the command would be:
zz = zipfile.ZipFile(z.namelist()[2])
 

в качестве альтернативы, если позиция индекса неизвестна, то же самое можно сделать следующим образом:

 zz  = zipfile.ZipFile(z.namelist()[z.namelist().index('xyz.zip')])