107 votes

Comment lire un fichier CSV depuis une URL avec Python ?

Lorsque je fais un curl vers un lien d'appel API http://example.com/passkey=wedsmdjsjmdd

curl 'http://example.com/passkey=wedsmdjsjmdd'

J'obtiens les données de sortie des employés dans un format de fichier csv, par exemple :

"Steve","421","0","421","2","","","","","","","","","421","0","421","2"

comment faire pour analyser tout cela en utilisant Python.

J'ai essayé :

import csv 
cr = csv.reader(open('http://example.com/passkey=wedsmdjsjmdd',"rb"))
for row in cr:
    print row

mais cela n'a pas fonctionné et j'ai obtenu une erreur

http://example.com/passkey=wedsmdjsjmdd No such file or directory:

Merci !

147voto

Kathirmani Points 524

En utilisant pandas, il est très simple de lire un fichier csv directement à partir d'une url.

import pandas as pd
data = pd.read_csv('https://example.com/passkey=wedsmdjsjmdd')

Cela permettra de lire vos données sous forme de tableau, ce qui sera très facile à traiter.

91voto

eandersson Points 8571

Vous devez remplacer open avec urllib.urlopen o urllib2.urlopen .

par exemple

import csv
import urllib2

url = 'http://winterolympicsmedals.com/medals.csv'
response = urllib2.urlopen(url)
cr = csv.reader(response)

for row in cr:
    print row

Le résultat serait le suivant

Year,City,Sport,Discipline,NOC,Event,Event gender,Medal
1924,Chamonix,Skating,Figure skating,AUT,individual,M,Silver
1924,Chamonix,Skating,Figure skating,AUT,individual,W,Gold
...

La question originale est étiquetée "python-2.x", mais pour une implémentation de Python 3 (qui ne nécessite que des changements mineurs) voir ci-dessous .

31voto

Rodo Points 832

Vous pourriez également le faire avec le module des demandes :

url = 'http://winterolympicsmedals.com/medals.csv'
r = requests.get(url)
text = r.iter_lines()
reader = csv.reader(text, delimiter=',')

31voto

The Aelfinn Points 3530

Pour augmenter les performances lors du téléchargement d'un fichier volumineux, les éléments ci-dessous peuvent fonctionner un peu plus efficacement :

import requests
from contextlib import closing
import csv

url = "http://download-and-process-csv-efficiently/python.csv"

with closing(requests.get(url, stream=True)) as r:
    reader = csv.reader(r.iter_lines(), delimiter=',', quotechar='"')
    for row in reader:
        # Handle each row here...
        print row   

En fixant stream=True dans la requête GET, lorsque nous passons r.iter_lines() à csv.reader(), nous passons un fichier générateur à csv.reader(). En faisant cela, nous permettons à csv.reader() d'itérer paresseusement sur chaque ligne de la réponse avec la commande for row in reader .

Cela évite de charger l'intégralité du fichier en mémoire avant de commencer à le traiter, ce qui réduit considérablement la charge mémoire pour les fichiers volumineux.

30voto

TheDudeAbides Points 374

Cette question est étiquetée python-2.x Il ne semblait donc pas correct de modifier la question originale, ou la réponse acceptée. Cependant, Python 2 n'est maintenant plus supporté, et cette question a toujours un bon jus de google pour "python csv urllib", donc voici une solution mise à jour pour Python 3.

Il est maintenant nécessaire de décoder urlopen La réponse de l'utilisateur (en octets) est convertie en un encodage local valide. réponse acceptée doit être légèrement modifié :

import csv, urllib.request

url = 'http://winterolympicsmedals.com/medals.csv'
response = urllib.request.urlopen(url)
lines = [l.decode('utf-8') for l in response.readlines()]
cr = csv.reader(lines)

for row in cr:
    print(row)

Notez la ligne supplémentaire commençant par lines = le fait que urlopen est maintenant dans le urllib.request module, et print nécessite bien sûr des parenthèses.

C'est à peine annoncé, mais oui, csv.reader peut lire à partir d'une liste de chaînes de caractères.

Et puisque quelqu'un d'autre a mentionné les pandas, voici une ligne simple pour afficher le CSV dans une sortie conviviale pour la console :

python3 -c 'import pandas
df = pandas.read_csv("http://winterolympicsmedals.com/medals.csv")
print(df.to_string())'

(Oui, c'est trois lignes, mais vous pouvez le copier-coller comme une seule commande ;)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X