将 csv 的每一行写入新的 csv 文件

问题描述 投票:0回答:1

我有一个包含 3 列的 csv 文件(订单号、日期、文件名]。

我需要为每一行创建 1 个 csv 文件,文件名基于 [文件名] 字段,仅包含 [订单号] 和 [日期] 字段,没有标题。

在其他一些帖子的帮助下,我已经得到了以下内容。这些文件正在使用正确的名称创建,但我将两个字段作为一个字段一起运行

import csv
with open("//server2/shared/Data/TestExport.csv",'r') as csvfile:
        reader = csv.DictReader(csvfile)
        for row in reader:
            file_name ='{0}.csv'.format(row['FileName']) 
            with open(file_name, 'w') as f:
                   f.write(row['Order Number'])
                   
                   f.write(row['Date'])

我预计这是一个相当基本的错误 - 这是我第一次尝试 Python!

python
1个回答
0
投票

我无法找到我喜欢的副本,所以如果没有大量潜在的输出文件,我可能会这样做。我将使用

contextlib.ExitStack()
堆栈的字典,其中包含
FileName
的键和打开的文件句柄的值。这样,每个输出文件只能打开一次,而不是每个输入行,并以写入模式打开,而不是写入或追加。

import csv
import contextlib

file_in_path = "in.csv"
writers = {}
with contextlib.ExitStack() as stack:
    for row in csv.DictReader(stack.enter_context(open(file_in_path, "r"))):
        file_name = row['FileName']
        if file_name not in writers:
            ctx = stack.enter_context(open(f"{file_name}.csv", "w", newline=""))
            writer = csv.DictWriter(ctx, fieldnames=["Order Number", "Date"], extrasaction="ignore")
            writer.writeheader()
            writers[file_name] = writer
        writers[file_name].writerow(row)
© www.soinside.com 2019 - 2024. All rights reserved.