2015-07-27 17 views
9

Sto scaricando un file CSV direttamente da un URL utilizzando requests.Python csv.DictReader: stringa parse?

Come analizzare la stringa risultante con csv.DictReader?

In questo momento ho questo:

r = requests.get(url) 
reader_list = csv.DictReader(r.text) 
print reader_list.fieldnames 
for row in reader_list: 
    print row 

Ma ottengo solo ['r'] come il risultato di fieldnames, e quindi tutti i tipi di cose strane da print row.

+0

Che cosa? Url'? Cosa c'è in 'r.text'? – jonrsharpe

risposta

16

Da documentazione csv, il primo argomento di csv.reader o csv.DictReader è csvfile -

csvfile può essere qualsiasi oggetto che supporta il protocollo iteratore e restituisce una stringa ogni volta che il suo metodo next() viene chiamato - File oggetti e gli oggetti della lista sono entrambi adatti

Nel tuo caso quando si dà la stringa come ingresso diretto per la csv.DictReader(), la chiamata next() su di esso fornisce solo un singolo carattere, e quindi diventa intestazione, quindi next() viene continuamente chiamato per ottenere ogni riga.

Quindi, è necessario sia fornire un flusso in memoria della stringa (Utilizzando StringIO) o un elenco di linee (usando splitlines)

È possibile utilizzare io.StringIO() e poi utilizzarlo in csv.DictReader. Esempio/Demo -

>>> import csv 
>>> s = """a,b,c 
... 1,2,3 
... 4,5,6 
... 7,8,9""" 
>>> import io 
>>> reader_list = csv.DictReader(io.StringIO(s)) 
>>> print reader_list.fieldnames 
['a', 'b', 'c'] 
>>> for row in reader_list: 
...  print row 
... 
{'a': '1', 'c': '3', 'b': '2'} 
{'a': '4', 'c': '6', 'b': '5'} 
{'a': '7', 'c': '9', 'b': '8'} 

O come indicato nei commenti, è possibile dividere le righe prima di dare come input per csv.DictReader. Esempio/Demo -

>>> reader_list = csv.DictReader(s.splitlines()) 
>>> print reader_list.fieldnames 
['a', 'b', 'c'] 
>>> for row in reader_list: 
...  print row 
... 
{'a': '1', 'c': '3', 'b': '2'} 
{'a': '4', 'c': '6', 'b': '5'} 
{'a': '7', 'c': '9', 'b': '8'} 
+0

Grazie, fatto. –

+0

Molto meglio, grazie! – jonrsharpe