我的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中仍然为空。
答案 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