Python csv.DictReader:解析字符串?

时间:2015-07-27 16:11:57

标签: python csv

我正在使用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的所有奇怪的事情。

1 个答案:

答案 0 :(得分:34)

csv的文档中,csv.readercsv.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