Python 3.6: 使用 DictWriter 重命名列 header

Python 3.6: rename column header using DictWriter

我的 python 脚本当前使用 DictWriter 读取 csv 文件,re-arrange 列并写入新的输出 csv 文件。输入 CSV 文件包含以下列:

A;B;C;D

将转移到:

B,C;A;D

此外,我想重命名其中一个header。我已经尝试了两种方法:

1.) 创建一个新的 writer object 并使用 `writer' 方法。但是,这只是将所有给定的字段名放在第一列中:

newHeader = csv.writer(outfile)
newFN = ['B', 'C', 'Renamed', 'D']
newHeader.writerow(newFN)

输出是:

B,C,Renamed,D;;;

2.) 使用现有的 DictWriter object 我定义了一个新的列列表 headers 并迭代它:

newHeader = ['B', 'C', 'Renamed', 'D']
writer.writerow(dict((fn, fn) for fn in newHeader))

但是这一次,重命名的列 header 在输出 CSV 中仍然为空。

您可以使用字典重命名列,并 csv.writer 从重新排序的 OrderedDict 对象写入值:

from io import StringIO
from collections import OrderedDict
import csv

mystr = StringIO("""A;B;C;D
1;2;3;4
5;6;7;8""")

order = ['B', 'C', 'A', 'D']

# define renamed columns via dictionary
renamer = {'C': 'C2'}

# define column names after renaming
new_cols = [renamer.get(x, x) for x in order]

# replace mystr as open(r'file.csv', 'r')
with mystr as fin, open(r'C:\temp\out.csv', 'w', newline='') as fout:

    # define reader / writer objects
    reader = csv.DictReader(fin, delimiter=';')
    writer = csv.writer(fout, delimiter=';')

    # write new header
    writer.writerow(new_cols)

    # iterate reader and write row
    for item in reader:
        writer.writerow([item[k] for k in order])

结果:

B;C2;A;D
2;3;1;4
6;7;5;8