【问题标题】:How to use csv reader to map columns from one file to another如何使用 csv 阅读器将列从一个文件映射到另一个文件
【发布时间】:2021-05-20 15:29:54
【问题描述】:

我是 Python csv.reader 的新手,我正在尝试使用 sheet1 中的标题填充 sheet2 中的数据:

sheet1.csv 包含以下标题

  1         2         3         4         5         6         7  

sheet2.csv 包含以下数据

  col_1     col_4     col_5     col_7
 yellow      Blue     Green       Red

想要的输出如下:

      1         2         3         4         5         6         7  
 Yellow                          Blue     Green                 Red

最初我使用pandas 完成此操作,但我想在python 中使用csv.reader 完成此操作。

这是我目前的尝试:

import csv

with open('sheet1.csv', newline='') as myFile:
    reader = csv.reader(myFile)
    for row in reader:
        print(row)

【问题讨论】:

    标签: python excel csv dictionary csvreader


    【解决方案1】:

    我知道我以前回答过这个问题,但我懒得去找原帖。

    [mre] 版本:

    from io import StringIO
    import csv
    import sys
    
    # map column names to template
    mapper = lambda fieldname: fieldname.split('_')[-1]
    
    template = '''\
    1,2,3,4,5,6,7
    '''
    
    source = '''\
    col_1,col_4,col_5,col_7
    Yellow,Blue,Green,Red
    White,Black,Cyan,Magenta
    '''
    
    fieldnames = csv.DictReader(StringIO(template)).fieldnames
    
    out = csv.DictWriter(sys.stdout, fieldnames)
    out.writeheader()
    
    reader = csv.DictReader(StringIO(source))
    for row in reader:
        out.writerow({mapper(k): v for (k, v) in row.items()})
    

    带有实际文件版本:

    import csv
    
    # map column names to template
    mapper = lambda fieldname: fieldname.split('_')[-1]
    
    with open('template.csv', newline='') as template:
        fieldnames = csv.DictReader(template).fieldnames
    
    with open('source.csv', newline='') as source, open('output.csv', 'w', newline='') as output:
        reader = csv.DictReader(source)
    
        out = csv.DictWriter(output, fieldnames)
        out.writeheader()
    
        for row in reader:
            out.writerow({mapper(k): v for (k, v) in row.items()})
    

    输出:

    1,2,3,4,5,6,7
    Yellow,,,Blue,Green,,Red
    White,,,Black,Cyan,,Magenta
    

    【讨论】:

    • 当然,将调用out = csv.DictWriter(sys.stdout, fieldnames) 中的sys.stdout 替换为您的文件。
    • 我有 1,2,3,4,5,6,7 这个作为我的 output.csv @Justin Ezequiel
    • 执行print(fieldnames) 以查看从“template.csv”中读取的内容。您的文件似乎缺少“1”。
    • 这些中的大多数您可以通过添加打印调用来自己调试。我建议你回去阅读基础知识。
    • 请注意输入 CSV 文件开头的 Byte order mark (BOM)
    猜你喜欢
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 2015-11-21
    • 2021-02-26
    • 2014-12-11
    • 2015-12-26
    相关资源
    最近更新 更多