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")