我的 python 脚本目前使用 DictWriter 读取 csv 文件,重新排列列并写入新的输出 csv 文件。输入的 CSV 文件有以下列:A;B;C;D,将被转换为...
我的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 中仍然是空的。
您可以使用字典重命名列并 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