J'utilise Python 3.4 avec IPython et j'ai le code suivant. Je ne parviens pas à lire un fichier csv à partir de l'URL donnée:
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)
J'ai l'erreur suivante
"Nom du chemin de fichier attendu ou objet de type fichier, type obtenu"
Comment puis-je réparer cela?
c=pd.read_csv(io.StringIO(s.decode("utf-8")))
mais vous récupérez html pas un fichier csv donc cela ne fonctionnera pas"https://raw.github.com/cs109/2014_data/blob/master/countries.csv"
.Réponses:
Mettre à jour
Depuis les pandas,
0.19.2
vous pouvez maintenant simplement passer l'URL directement .Tout comme l'erreur le suggère,
pandas.read_csv
nécessite un objet semblable à un fichier comme premier argument.Si vous souhaitez lire le csv à partir d'une chaîne, vous pouvez utiliser
io.StringIO
(Python 3.x) ouStringIO.StringIO
(Python 2.x) .De plus, pour l'URL - https://github.com/cs109/2014_data/blob/master/countries.csv - vous obtenez une
html
réponse, pas un csv brut, vous devez utiliser l'URL fournie par leRaw
lien dans la page github pour obtenir une réponse csv brute, qui est - https://raw.githubusercontent.com/cs109/2014_data/master/countries.csvExemple -
la source
c=pd.read_csv(url)
pandas
(0.23.4), mais je ne pouvais pas donner directement l'URL. Cette réponse m'a aidé à faire fonctionner cela.Dans la dernière version de pandas (
0.19.2
), vous pouvez directement passer l'urlla source
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)>
cause du protocole https que urllib ne peut pas gérer.Comme je l'ai commenté, vous devez utiliser un objet StringIO et décoder, c'est-à
c=pd.read_csv(io.StringIO(s.decode("utf-8")))
- dire si vous utilisez des requêtes, vous devez décoder en tant que .content renvoie des octets si vous avez utilisé .text, il vous suffirait de passer s tel quels = requests.get(url).text
c =pd.read_csv(StringIO(s))
.Une approche plus simple consiste à transmettre l'URL correcte des données brutes directement à
read_csv
, vous n'avez pas à passer un fichier comme un objet, vous pouvez passer une URL pour ne pas avoir besoin de requêtes du tout:Production:
À partir de la documentation :
filepath_or_buffer :
la source
Le problème que vous rencontrez est que la sortie que vous obtenez dans la variable 's' n'est pas un csv, mais un fichier html. Afin d'obtenir le csv brut, vous devez modifier l'url en:
« https://raw.githubusercontent.com/cs109/2014_data/master/countries.csv »
Votre deuxième problème est que read_csv attend un nom de fichier, nous pouvons le résoudre en utilisant StringIO du module io. Le troisième problème est que request.get (url) .content délivre un flux d'octets, nous pouvons le résoudre en utilisant le request.get (url) .text à la place.
Le résultat final est ce code:
production:
la source
la source
la source