Python 3.6:使用DictWriter重命名列标题

时间:2018-07-18 08:26:38

标签: python python-3.x csv dictionary ordereddictionary

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

A;B;C;D

将被转移到:

B,C;A;D

此外,我想重命名标题之一。我已经尝试了两种方法:

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

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

输出为:

B,C,Renamed,D;;;

2。)使用现有的DictWriter对象,我定义了一个新的列标题列表并对其进行迭代:

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

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

1 个答案:

答案 0 :(得分:1)

您可以使用字典重命名列,并使用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