从csv 的文档来看,csv.reader 或csv.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'}