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
我的 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