【问题标题】:How to write script using actual csv files rather than stringIO如何使用实际的 csv 文件而不是 stringIO 编写脚本
【发布时间】:2021-08-12 23:36:15
【问题描述】:

由于数据集太大,我如何编写以下脚本,该脚本使用导入的字符串 IO 将列标题重命名和重新排序为使用实际 csv 文件的格式。

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])

【问题讨论】:

    标签: python csv rename import-csv


    【解决方案1】:

    您的代码的主要问题是with 代码需要缩进才能正常工作。以下是对您的代码的小改动,使其可以从一个 csv 读取并写入另一个:

    from io import StringIO
    from collections import OrderedDict
    import csv
    
    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 open('C:\tmp\in.csv') 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])
    

    【讨论】:

    • 这表明您的输入文件/数据没有“A”列。
    猜你喜欢
    • 2021-12-16
    • 1970-01-01
    • 2016-11-03
    • 2018-11-30
    • 2022-12-15
    • 2010-12-11
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    相关资源
    最近更新 更多