Estoy usando Python 3.4 con IPython y tengo el siguiente código. No puedo leer un archivo csv de la URL dada:
import pandas as pd
import requests
url="https://github.com/cs109/2014_data/blob/master/countries.csv"
s=requests.get(url).content
c=pd.read_csv(s)
Tengo el siguiente error
"Nombre de ruta de archivo esperado u objeto similar a un archivo, tipo"
¿Cómo puedo arreglar esto?
c=pd.read_csv(io.StringIO(s.decode("utf-8")))
pero está recibiendo html de vuelta, no un archivo csv, por lo que no va a funcionar"https://raw.github.com/cs109/2014_data/blob/master/countries.csv"
.Respuestas:
Actualizar
Desde los pandas
0.19.2
ahora puede pasar la URL directamente .Tal como sugiere el error,
pandas.read_csv
necesita un objeto similar a un archivo como primer argumento.Si desea leer el csv de una cadena, puede usar
io.StringIO
(Python 3.x) oStringIO.StringIO
(Python 2.x) .Además, para la URL: https://github.com/cs109/2014_data/blob/master/countries.csv : está obteniendo una
html
respuesta, no un csv sin procesar, debe usar la URL proporcionada por elRaw
enlace en la página de github para obtener una respuesta csv sin procesar, que es - https://raw.githubusercontent.com/cs109/2014_data/master/countries.csvEjemplo
fuente
c=pd.read_csv(url)
pandas
(0.23.4), pero no pude dar URL directamente. Esta respuesta me ayudó a que funcione.En la última versión de pandas (
0.19.2
) puedes pasar directamente la urlfuente
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)>
debido al protocolo https que urllib no puede manejar.Como comenté, debe usar un objeto StringIO y descodificar, es decir,
c=pd.read_csv(io.StringIO(s.decode("utf-8")))
si usa solicitudes, debe descodificar ya que .content devuelve bytes si usó .text solo necesitaría pasar s como ess = requests.get(url).text
c =pd.read_csv(StringIO(s))
.Un enfoque más simple es pasar la url correcta de los datos sin procesar directamente
read_csv
, no tiene que pasar un archivo como objeto, puede pasar una url para que no necesite solicitudes:Salida:
De los documentos :
filepath_or_buffer :
fuente
El problema que tiene es que el resultado que obtiene en la variable 's' no es un csv, sino un archivo html. Para obtener el csv sin formato, debe modificar la url para:
' https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv '
Su segundo problema es que read_csv espera un nombre de archivo, podemos resolver esto usando StringIO del módulo io. El tercer problema es que request.get (url) .content entrega una secuencia de bytes, podemos resolver esto usando request.get (url) .text en su lugar.
El resultado final es este código:
salida:
fuente
fuente
fuente