Ich verwende Python 3.4 mit IPython und habe den folgenden Code. Ich kann keine CSV-Datei von der angegebenen URL lesen:
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)
Ich habe den folgenden Fehler
"Erwarteter Dateipfadname oder dateiähnliches Objekt, Typ erhalten"
Wie kann ich das beheben?
c=pd.read_csv(io.StringIO(s.decode("utf-8")))
aber Sie bekommen HTML zurück, keine CSV-Datei, so dass es nicht funktionieren wird"https://raw.github.com/cs109/2014_data/blob/master/countries.csv"
.Antworten:
Aktualisieren
Von Pandas können
0.19.2
Sie jetzt einfach die URL direkt übergeben .Wie der Fehler andeutet, wird
pandas.read_csv
als erstes Argument ein dateiähnliches Objekt benötigt.Wenn Sie die CSV aus einer Zeichenfolge lesen möchten, können Sie
io.StringIO
(Python 3.x) oderStringIO.StringIO
(Python 2.x) verwenden .Außerdem erhalten Sie für die URL - https://github.com/cs109/2014_data/blob/master/countries.csv - eine
html
Antwort, keine rohe CSV. Verwenden Sie die URL, die durch denRaw
Link auf der Github-Seite für angegeben wird Erhalten einer rohen CSV-Antwort: https://raw.githubusercontent.com/cs109/2014_data/master/countries.csvBeispiel -
quelle
c=pd.read_csv(url)
pandas
(0.23.4), aber ich konnte die URL nicht direkt angeben. Diese Antwort hat mir geholfen, das zum Laufen zu bringen.In der neuesten Version von pandas (
0.19.2
) können Sie die URL direkt übergebenquelle
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)>
aufgrund des https-Protokolls zurückgegeben, das urllib nicht verarbeiten kann.Wie ich bereits sagte, müssen Sie ein StringIO-Objekt verwenden und dekodieren, dh
c=pd.read_csv(io.StringIO(s.decode("utf-8")))
wenn Sie Anforderungen verwenden, müssen Sie dekodieren, da .content Bytes zurückgibt, wenn Sie .text verwenden, müssen Sie nur s so übergeben, wie ess = requests.get(url).text
c = istpd.read_csv(StringIO(s))
.Ein einfacherer Ansatz besteht darin, die korrekte URL der Rohdaten direkt an zu übergeben
read_csv
. Sie müssen kein dateiähnliches Objekt übergeben. Sie können eine URL übergeben, sodass Sie überhaupt keine Anforderungen benötigen:Ausgabe:
Aus den Dokumenten :
Dateipfad_oder_Buffer :
quelle
Das Problem ist, dass die Ausgabe, die Sie in die Variable 's' erhalten, keine CSV-Datei, sondern eine HTML-Datei ist. Um die rohe CSV zu erhalten, müssen Sie die URL ändern in:
' https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv '
Ihr zweites Problem ist, dass read_csv einen Dateinamen erwartet. Wir können dies mithilfe von StringIO aus dem io-Modul lösen. Das dritte Problem ist, dass request.get (url) .content einen Bytestream liefert. Wir können dies stattdessen mit dem request.get (url) .text lösen.
Endergebnis ist dieser Code:
Ausgabe:
quelle
quelle
quelle