我正在使用requests
直接从网址下载CSV文件。
如何使用csv.DictReader
解析结果字符串?
现在我有这个:
r = requests.get(url)
reader_list = csv.DictReader(r.text)
print reader_list.fieldnames
for row in reader_list:
print row
但我得['r']
作为fieldnames
的结果,然后来自print row
的所有奇怪的事情。
答案 0 :(得分:34)
从csv
的文档中,csv.reader
或csv.DictReader
的第一个参数是csvfile
-
csvfile可以是任何支持迭代器协议的对象,每次调用next()方法时都返回一个字符串 - 文件对象和列表对象都适合
在您将字符串作为csv.DictReader()
的直接输入的情况下,next()
上的splitlines
调用仅提供单个字符,因此成为标题,然后是next()不断被要求获得每一行。
因此,您需要提供字符串的内存中流(使用StringIO)或行列表(使用csv.DictReader
)
您可以使用io.StringIO()
,然后在>>> 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'}
中使用它。示例/演示 -
csv.DictReader
或者如评论中所示,您可以在给予>>> 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'}
作为输入之前拆分线。示例/演示 -
SELECT admin_no,rank,total_score
FROM (SELECT *, @auto:=@auto+1 AS rank
FROM (SELECT * FROM
(SELECT admin_no, SUM(exam)+SUM(ca) AS total_score,year,class_s
FROM subjects_1 ,
(SELECT @auto:=0, @marks:=0) as init WHERE `class_s`='Grade 2' and `year`='2014/2015'
GROUP BY admin_no ) sub ORDER BY total_score DESC)t) as result