【问题标题】:Python 3.6: rename column header using DictWriterPython 3.6:使用 DictWriter 重命名列标题
【发布时间】:2018-12-26 01:58:51
【问题描述】:

我的 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 中保持为空。

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 工作就像一个魅力。谢谢。
    猜你喜欢
    • 2020-04-05
    • 1970-01-01
    • 2022-06-22
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多