可以使用csv.DictReader保持列的顺序吗?
比如,我的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
中保持相同的表头。