Usando pandas read_csv con compresión zip

Estoy intentando usar read_csv en pandas para leer un archivo comprimido desde un servidor FTP. El archivo zip contiene un solo archivo, como se requiere.

Aquí está mi código:

 pd.read_csv('ftp://ftp.fec.gov/FEC/2016/cn16.zip', compression='zip') 

Me sale este error:

 AttributeError: addinfourl instance has no attribute 'seek' 

Me sale este error en ambos pandas 18.1 y 19.0. ¿Me estoy perdiendo algo, o podría ser esto un error?

Aunque no estoy completamente seguro de por qué se urllib2 el error, puede urllib2 abriendo la url mediante urllib2 y escribiendo los datos en una secuencia binaria en memoria, como se muestra aquí . Además, tenemos que especificar el separador correcto o, de lo contrario, recibiríamos otro error.

 import io import urllib2 as urllib import pandas as pd r = urllib.urlopen('ftp://ftp.fec.gov/FEC/2016/cn16.zip') df = pd.read_csv(io.BytesIO(r.read()), compression='zip', sep='|', header=None) 

En cuanto al error en sí, creo que los pandas están tratando de usar la función de búsqueda en el “archivo zip” antes de descargar el contenido de la URL (por lo que no es realmente un archivo zip), lo que daría lugar a ese error.

 header = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:32.0) Gecko/20100101 Firefox/54.0.1',} remotezip = requests.get(url, headers=header) root = zipfile.ZipFile(io.BytesIO(remotezip.content)) for name in root.namelist(): df = pd.read_csv(root.open(name)) 

Tomado de mi propia publicación en el blog: lea los archivos csv comprimidos en Python Pandas sin descargar el archivo zip

pandas ahora admite cargar datos directamente desde zip u otros archivos comprimidos a DataFrame.

compresión: {‘inferir’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, Ninguno}, por defecto ‘inferir’

Para la descompresión sobre la marcha de los datos en disco. Si ‘inferir’ y filepath_or_buffer es como una ruta, entonces detecte la compresión de las siguientes extensiones: ‘.gz’, ‘.bz2’, ‘.zip’ o ‘.xz’ (de lo contrario no hay descompresión). Si usa ‘zip’, el archivo ZIP debe contener solo un archivo de datos para ser leído. Establezca en Ninguno para que no haya descompresión.

Nuevo en la versión 0.18.1: soporte para compresión ‘zip’ y ‘xz’.

 import pandas as pd df = pd.read_csv("path_to_file.zip") # or df = pd.read_csv("path_to_file.zip", compression="zip")