Tengo un archivo .zip con filename.xlsx dentro y quiero analizar la hoja de Excel línea por línea.
¿Cómo pasar correctamente el nombre de archivo a pandas.read_excel en este caso?
Lo intenté:
import zipfile import pandas myzip=zipfile.ZipFile(filename.zip) for fname in myzip.namelist(): with myzip.open(fname) as from_archive: with pandas.read_excel(from_archive) as fin: for line in fin: ....
pero no parece funcionar, y el resultado fue:
AttributeError: __exit__
Puede extraer su archivo zip en una variable en la memoria y analizarlo usando io.BytesIO
:
import io from zipfile import ZipFile import pandas as pd def read_zip(zip_fn, extract_fn=None): zf = ZipFile(zip_fn) if extract_fn: return zf.read(extract_fn) else: return {name:zf.read(name) for name in zf.namelist()}
Uso:
df = pd.read_excel(io.BytesIO(read_zip(r'C:\download\test.xlsx.zip', 'test.xlsx')))
Alternativamente, puede extraer archivos del archivo zip al disco y analizarlos como archivos normales.
PD: hay toneladas de ejemplos en StackOverflow, que muestran cómo explotar un archivo zip...
Usando el archivo zip
import zipfile archive = zipfile.ZipFile('filename.zip', 'r') xlfile = archive.open('filename.xlsx') df = pd.read_excel(xlfile)
forma sencilla es:
df = pd.read_csv('ruta al archivo', compresión='zip').
si lo necesita, puede agregar atr adicional: codificación = 'windows-1251' y sep = ''