是否可以使用 csv.DictReader 保持列顺序?

新手上路,请多包涵

例如,我的 csv 包含如下列:

 ID, ID2, Date, Job No, Code

我需要以相同的顺序写回列。 dict 立即打乱了顺序,所以我相信这更多是读者的问题。

原文由 Alex 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 799
2 个回答

Python 的 dict s 不保持 3.6 之前的顺序(但是,无论如何,在该版本中, csv.DictReader 类被修改为返回 OrderedDict )。

但是,您正在使用的 csv.DictReader 的实例(在您阅读第一行之后!-) 确实 有一个 .fieldnames 字符串 列表,这是按顺序排列的。

所以,

 for rowdict in myReader:
  print ['%s:%s' % (f, rowdict[f]) for f in myReader.fieldnames]

将向您展示订单确实得到了维护(在 .fieldnames 当然, 永远不会dict 中 - 这在 Python 中本质上是不可能的!-)。

因此,假设您想以相同的列顺序读取 a.csv 并写入 b.csv 。使用普通的 reader 和 writer 太容易了,所以您想改用 Dict 变体;-)。好吧,一种方法是……:

 import csv

a = open('a.csv', 'r')
b = open('b.csv', 'w')
ra = csv.DictReader(a)
wb = csv.DictWriter(b, None)

for d in ra:

  if wb.fieldnames is None:
    # initialize and write b's headers
    dh = dict((h, h) for h in ra.fieldnames)
    wb.fieldnames = ra.fieldnames
    wb.writerow(dh)

  wb.writerow(d)

b.close()
a.close()

假设您在 a.csv 中有标头(否则您不能在其上使用 DictReader)并且只需要 b.csv 中的相同标头。

原文由 Alex Martelli 发布,翻译遵循 CC BY-SA 3.0 许可协议

从每一行制作一个 OrderedDict dict DictReader.fieldnames

 import csv
from collections import OrderedDict

reader = csv.DictReader(open("file.csv"))
for row in reader:
    sorted_row = OrderedDict(sorted(row.items(),
          key=lambda item: reader.fieldnames.index(item[0])))

原文由 xvan 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题