2015-07-27 19 views
9

Pobieram plik CSV bezpośrednio z adresu URL przy użyciu requests.Python csv.DictReader: parsować ciąg?

Jak mogę analizować wynikowy ciąg z csv.DictReader?

Teraz mam to:

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

Ale ja po prostu ['r'] wskutek fieldnames, a następnie wszystkie rodzaje dziwnych rzeczy z print row.

+0

Jaki "adres"? Co znajduje się w 'r.text'? – jonrsharpe

Odpowiedz

16

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'} 
+0

Dziękuję, gotowe. –

+0

Znacznie lepiej, dzięki! – jonrsharpe