Estou usando o Python 3.4 com IPython e tenho o seguinte código. Não consigo ler um arquivo csv a partir do URL fornecido:
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)
Eu tenho o seguinte erro
"Nome esperado do caminho do arquivo ou objeto parecido com arquivo, tipo"
Como posso consertar isso?
c=pd.read_csv(io.StringIO(s.decode("utf-8")))
, mas você está recebendo html volta não um arquivo CSV para que ele não vai funcionar"https://raw.github.com/cs109/2014_data/blob/master/countries.csv"
.Respostas:
Atualizar
Dos pandas,
0.19.2
agora você pode passar o URL diretamente .Assim como o erro sugere,
pandas.read_csv
precisa de um objeto semelhante a um arquivo como o primeiro argumento.Se você quiser ler o csv de uma string, poderá usar
io.StringIO
(Python 3.x) ouStringIO.StringIO
(Python 2.x) .Além disso, para o URL - https://github.com/cs109/2014_data/blob/master/countries.csv - você está recebendo
html
resposta de retorno , não csv bruto, deve usar o URL fornecido peloRaw
link na página do github para obtendo resposta csv bruta, que é - https://raw.githubusercontent.com/cs109/2014_data/master/countries.csvExemplo -
fonte
c=pd.read_csv(url)
pandas
(0.23.4), mas não pude dar o URL diretamente. Essa resposta me ajudou a fazer isso funcionar.Na versão mais recente do pandas (
0.19.2
), você pode transmitir diretamente o URLfonte
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)>
por causa do protocolo https que o urllib não pode manipular.Como eu comentei, você precisa usar um objeto StringIO e decodificar, ou seja,
c=pd.read_csv(io.StringIO(s.decode("utf-8")))
se estiver usando solicitações, precisará decodificar como .content retorna bytes se você usou .text, você só precisará passar s como estás = requests.get(url).text
c =pd.read_csv(StringIO(s))
.Uma abordagem mais simples é passar o URL correto dos dados brutos diretamente para
read_csv
, você não precisa passar um arquivo como objeto, pode passar um URL para não precisar de solicitações:Resultado:
Dos documentos :
filepath_or_buffer :
fonte
O problema que você está tendo é que a saída que você obtém na variável 's' não é um csv, mas um arquivo html. Para obter o csv bruto, você deve modificar o URL para:
' https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv '
Seu segundo problema é que o read_csv espera um nome de arquivo. Podemos resolver isso usando o StringIO do módulo io. O terceiro problema é que request.get (url) .content fornece um fluxo de bytes, podemos resolver isso usando o request.get (url) .text.
O resultado final é este código:
resultado:
fonte
fonte
fonte