Używam języka Python 3.4 z IPythonem i mam następujący kod. Nie mogę odczytać pliku CSV z podanego adresu URL:
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)
Mam następujący błąd
„Oczekiwana nazwa ścieżki do pliku lub obiekt podobny do pliku, pobrano typ”
Jak mogę to naprawić?
c=pd.read_csv(io.StringIO(s.decode("utf-8")))
ale otrzymujesz z powrotem html, a nie plik csv, więc to nie zadziała"https://raw.github.com/cs109/2014_data/blob/master/countries.csv"
.Odpowiedzi:
Aktualizacja
Z pand
0.19.2
możesz teraz bezpośrednio przekazać adres URL .Tak jak sugeruje błąd,
pandas.read_csv
jako pierwszy argument potrzebny jest obiekt podobny do pliku.Jeśli chcesz odczytać plik csv z łańcucha, możesz użyć
io.StringIO
(Python 3.x) lubStringIO.StringIO
(Python 2.x) .Również w przypadku adresu URL - https://github.com/cs109/2014_data/blob/master/countries.csv - otrzymujesz
html
odpowiedź zwrotną, a nie surowy csv, powinieneś użyć adresu URL podanego wRaw
linku na stronie github dla uzyskiwanie nieprzetworzonej odpowiedzi csv, czyli - https://raw.githubusercontent.com/cs109/2014_data/master/countries.csvPrzykład -
źródło
c=pd.read_csv(url)
pandas
(0.23.4), ale nie mogłem bezpośrednio podać adresu URL. Ta odpowiedź pomogła mi w uruchomieniu.W najnowszej wersji pandas (
0.19.2
) możesz bezpośrednio podać adres URLźródło
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)>
powodu protokołu https, którego urllib nie obsługuje.Jak skomentowałem, musisz użyć obiektu StringIO i zdekodować, tj.
c=pd.read_csv(io.StringIO(s.decode("utf-8")))
Jeśli używasz żądań, musisz zdekodować, ponieważ .content zwraca bajty, jeśli użyłeś .text, po prostu musisz przekazać s tak, jak jests = requests.get(url).text
c =pd.read_csv(StringIO(s))
.Prostszym podejściem jest przekazanie prawidłowego adresu URL surowych danych bezpośrednio do
read_csv
, nie musisz przekazywać pliku takiego jak obiekt, możesz przekazać adres URL, aby w ogóle nie potrzebować żądań:Wynik:
Z dokumentów :
filepath_or_buffer :
źródło
Problem polega na tym, że wynik, który otrzymujesz do zmiennej 's', nie jest plikiem csv, ale plikiem html. Aby uzyskać nieprzetworzony plik csv, musisz zmodyfikować adres URL na:
„ https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv ”
Drugim problemem jest to, że read_csv oczekuje nazwy pliku, możemy to rozwiązać za pomocą StringIO z modułu io. Trzeci problem polega na tym, że request.get (url) .content dostarcza strumień bajtów, możemy to rozwiązać za pomocą request.get (url) .text.
Wynik końcowy to ten kod:
wynik:
źródło
źródło
źródło