Python Dictreader 对字段名进行排序

Posted

技术标签:

【中文标题】Python Dictreader 对字段名进行排序【英文标题】:Python Dictreader Sorting Fieldnames 【发布时间】:2012-12-28 09:03:58 【问题描述】:

我有一个包含内容的 .csv 文件(示例)

Attributes,Description,Dial-Up
4,2,0.2
3,1,0.4

使用字典阅读器:

dictreader = csv.DictReader(open(filename, "rb"), delimiter=',')
dictdata = 
count=0
for row in dictreader:
    dictdata[count]=row
    count=count+1

并显示在表格中或使用作家我会得到:

Dial-Up,Attributes,Description
0.2,4,2
0.4,3,1

那么我该如何对字段名进行排序呢?

【问题讨论】:

请包含创建显示的代码。这是帮助您的关键一步。因为这实际上是您的问题所在。 dict 类型未排序。你为什么使用DictReadercsv.reader 可能就是你想要的。 【参考方案1】:

DictReader 将字段(字典键)存储在名为 fieldnames 的属性中:

fields = dictreader.fieldnames
print(fields)
# ['Attributes', 'Description', 'Dial-Up']

所以要按这个顺序打印行值:

print(','.join(fields))
for row in dictreader:
    print(','.join(row[field] for field in fields))

产量

Attributes,Description,Dial-Up
4,2,0.2
3,1,0.4

或者,使用@JonClements 的想法:

import operator
fields = dictreader.fieldnames
getfields = operator.itemgetter(*fields)
for row in dictreader:
    print(','.join(getfields(row)))

使用operator.itemgetter 的动机是它比使用列表推导式更快:

In [70]: %timeit getfields(row)
10000000 loops, best of 3: 174 ns per loop

In [71]: %timeit [row[field] for field in fields]
1000000 loops, best of 3: 272 ns per loop

【讨论】:

或者 - print(','.join(itemgetter(*fields))) @JonClements:您使用itemgetter 的代码导致TypeError @martineau 好吧,我承认没有测试它,但不明白为什么 - 似乎 unutbu 如何实现它 @Jon Clements:unutbu 在他的更新答案中实现的内容与您在评论中的代码有很大不同。显然他能够弄清楚你想说什么。

以上是关于Python Dictreader 对字段名进行排序的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中使用 csv.DictReader 进行数据类型转换的最快方法

python通过DictReader实现两个csv文件的映射查找lookup之代码详解

如果我使用itertool中的islice从第5行开始,如何使用DictReader?

使用 DictReader 访问 CSV 的第三列时出现 KeyError [重复]

Python 3.2 在 csv.DictReader 中跳过一行

如何复制python DictReader对象?