使用 DictReader 从 CSV 文件读取到列表中
Read from CSV into a list with DictReader
代码:
def import_csv():
with open('list.csv') as csvfile:
reader = csv.DictReader(csvfile,delimiter=",")
print(list(reader))
输出是:
[OrderedDict([('Anrede', 'asfsf'), ('Vorname', 'dsfsdfsd'), ('Nachname', 'sdfsdfdsf'), ('Strasse', 'sdfsdfsd'), ('Hausnummer', 'sdf'), ('PLZ', 'dsf'), ('Stadt', 'dsf'), ('Telefon1', 'dsf'), ('Telefon2', 'sdf'), ('E-Mail', 'sdf')]), OrderedDict([('Anrede', '123123'), ('Vorname', '213213'), ('Nachname', '213123'), ('Strasse', '123213'), ('Hausnummer', '12312'), ('PLZ', '21323'), ('Stadt', '23'), ('Telefon1', '23'), ('Telefon2', '23'), ('E-Mail', '2')])]
我的 CSV 文件如下所示:
Anrede,Vorname,Nachname,Strasse,Hausnummer,PLZ,Stadt,Telefon1,Telefon2,E-Mail
asfsf,dsfsdfsd,sdfsdfdsf,sdfsdfsd,sdf,dsf,dsf,dsf,sdf,sdf
123123,213213,213123,123213,12312,21323,23,23,23,2
我找不到解决方案,为什么我的输出与这个问题的输出不同:Convert a csv.DictReader object to a list of dictionaries?
我想以 header 信息作为键将行读取为 dict
,然后将所有这些一起保存为列表。
那是因为他们在 python 3.6 中更改了 csv.DictReader
的实现。在这个新实现中有趣的是键的顺序类似于 header 并且它由 OrderedDict
object 保证(即使在 Python 3.6 中所有的字典都是有序的,但是这被视为实现细节,因此 csv
模块不依赖于它)
以前您的代码返回一个字典列表,现在它 returns 一个列表或 有序 个字典,这是一个专业化。
您担心数据的表示,但它会正常工作,它们仍然是字典(例如尝试 print(list(reader)[0]['Anrede'])
)
为了让您放心,请尝试转换为标准词典:
print([dict(d) for d in reader])
你会得到
[{'Anrede': 'asfsf', 'Vorname': 'dsfsdfsd', 'Nachname': 'sdfsdfdsf', 'Strasse': 'sdfsdfsd', 'Hausnummer': 'sdf', 'PLZ': 'dsf', 'Stadt': 'dsf', 'Telefon1': 'dsf', 'Telefon2': 'sdf', 'E-Mail': 'sdf'}, {'Anrede': '123123', 'Vorname': '213213', 'Nachname': '213123', 'Strasse': '123213', 'Hausnummer': '12312', 'PLZ': '21323', 'Stadt': '23', 'Telefon1': '23', 'Telefon2': '23', 'E-Mail': '2'}]
如果您是 运行 python.
早期版本的代码,那完全一样
直到 3.6 版本,DictReader 生成普通的字典。这在 3.6 上发生了变化。这就是为什么您输入的 link 得不到相同结果的原因。使用早期版本获取字典。或者坚持使用 3.6 - OrderedDict 也是很好用的数据结构。
Changed in version 3.6: Returned rows are now of type OrderedDict.
代码:
def import_csv():
with open('list.csv') as csvfile:
reader = csv.DictReader(csvfile,delimiter=",")
print(list(reader))
输出是:
[OrderedDict([('Anrede', 'asfsf'), ('Vorname', 'dsfsdfsd'), ('Nachname', 'sdfsdfdsf'), ('Strasse', 'sdfsdfsd'), ('Hausnummer', 'sdf'), ('PLZ', 'dsf'), ('Stadt', 'dsf'), ('Telefon1', 'dsf'), ('Telefon2', 'sdf'), ('E-Mail', 'sdf')]), OrderedDict([('Anrede', '123123'), ('Vorname', '213213'), ('Nachname', '213123'), ('Strasse', '123213'), ('Hausnummer', '12312'), ('PLZ', '21323'), ('Stadt', '23'), ('Telefon1', '23'), ('Telefon2', '23'), ('E-Mail', '2')])]
我的 CSV 文件如下所示:
Anrede,Vorname,Nachname,Strasse,Hausnummer,PLZ,Stadt,Telefon1,Telefon2,E-Mail
asfsf,dsfsdfsd,sdfsdfdsf,sdfsdfsd,sdf,dsf,dsf,dsf,sdf,sdf
123123,213213,213123,123213,12312,21323,23,23,23,2
我找不到解决方案,为什么我的输出与这个问题的输出不同:Convert a csv.DictReader object to a list of dictionaries?
我想以 header 信息作为键将行读取为 dict
,然后将所有这些一起保存为列表。
那是因为他们在 python 3.6 中更改了 csv.DictReader
的实现。在这个新实现中有趣的是键的顺序类似于 header 并且它由 OrderedDict
object 保证(即使在 Python 3.6 中所有的字典都是有序的,但是这被视为实现细节,因此 csv
模块不依赖于它)
以前您的代码返回一个字典列表,现在它 returns 一个列表或 有序 个字典,这是一个专业化。
您担心数据的表示,但它会正常工作,它们仍然是字典(例如尝试 print(list(reader)[0]['Anrede'])
)
为了让您放心,请尝试转换为标准词典:
print([dict(d) for d in reader])
你会得到
[{'Anrede': 'asfsf', 'Vorname': 'dsfsdfsd', 'Nachname': 'sdfsdfdsf', 'Strasse': 'sdfsdfsd', 'Hausnummer': 'sdf', 'PLZ': 'dsf', 'Stadt': 'dsf', 'Telefon1': 'dsf', 'Telefon2': 'sdf', 'E-Mail': 'sdf'}, {'Anrede': '123123', 'Vorname': '213213', 'Nachname': '213123', 'Strasse': '123213', 'Hausnummer': '12312', 'PLZ': '21323', 'Stadt': '23', 'Telefon1': '23', 'Telefon2': '23', 'E-Mail': '2'}]
如果您是 运行 python.
早期版本的代码,那完全一样直到 3.6 版本,DictReader 生成普通的字典。这在 3.6 上发生了变化。这就是为什么您输入的 link 得不到相同结果的原因。使用早期版本获取字典。或者坚持使用 3.6 - OrderedDict 也是很好用的数据结构。
Changed in version 3.6: Returned rows are now of type OrderedDict.