Z dokumentacji csv
, pierwszy argument csv.reader
lub csv.DictReader
jest csvfile
-
csvfile może być dowolny obiekt, który obsługuje protokół iterator i zwraca ciąg znaków za każdym razem jego metoda next() jest wywoływana - plik obiekty i przedmioty liście są zarówno odpowiednie
W twoim przypadku, gdy dajesz ciąg jako bezpośredni wkład w csv.DictReader()
, wywołanie next()
na to zapewnia tylko jeden znak, a stąd staje się nagłówkiem, a następnie next() jest ciągle wywoływany, aby uzyskać każdy wiersz.
Stąd trzeba też zapewnić strumień w pamięci łańcucha (używając StringIO) lub listę linii (z wykorzystaniem splitlines
)
Można użyć io.StringIO()
a następnie używać go w csv.DictReader
. Przykład/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'}
Albo jak wskazano w komentarzach, można podzielić linie przed podaniem jako wejście do csv.DictReader
. Przykład/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'}
Jaki "adres"? Co znajduje się w 'r.text'? – jonrsharpe