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'}
Che cosa? Url'? Cosa c'è in 'r.text'? – jonrsharpe