【问题标题】:Python csv.DictReader: parse string?Python csv.DictReader:解析字符串?
【发布时间】:2015-10-17 22:26:34
【问题描述】:

我正在使用requests 直接从 URL 下载 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得到各种奇怪的东西。

【问题讨论】:

    标签: python csv


    【解决方案1】:

    csv 的文档来看,csv.readercsv.DictReader 的第一个参数是csvfile -

    csvfile 可以是任何支持iterator 协议并在每次调用其__next__() 方法时返回一个字符串的对象——file objects 和列表对象都适用。

    在您的情况下,当您将字符串作为 csv.DictReader() 的直接输入时,对该字符串的 __next__() 调用仅提供一个字符,因此它成为标题,然后 __next__() 被连续调用获取每一行。

    因此,您需要使用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', 'b': '2', 'c': '3'}
    {'a': '4', 'b': '5', 'c': '6'}
    {'a': '7', 'b': '8', 'c': '9'}
    

    或使用str.splitlines的行列表:

    >>> reader_list = csv.DictReader(s.splitlines())
    >>> print(reader_list.fieldnames)
    ['a', 'b', 'c']
    >>> for row in reader_list:
    ...     print(row)
    ... 
    {'a': '1', 'b': '2', 'c': '3'}
    {'a': '4', 'b': '5', 'c': '6'}
    {'a': '7', 'b': '8', 'c': '9'}
    

    【讨论】:

    • splitlines() FTW
    • 使用 splitlines() 的问题是,如果内容在列中包含换行符(使用引号),无论如何都会换行。
    • 正如@augustomen 所评论的,您应该解释splitlines 可以打破记录数据行,因为它可以通过使用引号插入到字段中。如果这是一个问题,应该说明。如果csv库可以处理这个,也应该解释一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 2021-10-29
    • 2016-06-29
    • 2011-06-20
    相关资源
    最近更新 更多