可以使用csv.DictReader保持列的顺序吗?

42 投票
6 回答
32052 浏览
提问于 2025-04-15 16:54

比如,我的csv文件有以下这些列:

ID, ID2, Date, Job No, Code

我需要把这些列按原来的顺序写回去。但是使用dict的时候,顺序就会被打乱,所以我觉得这更像是读取时的问题。

6 个回答

9
from csv import DictReader, DictWriter

with open("input.csv", 'r') as input_file:
    reader = DictReader(f=input_file)
    with open("output.csv", 'w') as output_file:
        writer = DictWriter(f=output_file, fieldnames=reader.fieldnames)
        for row in reader:
            writer.writerow(row)

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更容易理解。

10

从每一行的 dict 创建一个 OrderedDict,并按照 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])))
65

在 Python 3.6 之前,dict(字典)是不会保持顺序的。不过在 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,保持相同的列顺序。使用普通的读取和写入方式太简单了,所以你想用字典类型的方式来处理;-)。一种方法是...:

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 中保持相同的表头。

撰写回答