Python CSV 数据处理:合并重复行并写入新文件

该代码用于处理 CSV 文件,主要功能是将文件中重复的行进行合并,并将处理后的结果写入到一个新的 CSV 文件中。

import csv

# 读取SUM.csv文件
with open('SUM.csv', 'r') as file:
    reader = csv.DictReader(file)
    rows = list(reader)

# 处理数据并生成新的行
new_rows = []
for i in range(len(rows)):
    current_row = rows[i]
    if i > 0:
        previous_row = rows[i-1]
        if current_row['销售日期'] == previous_row['销售日期'] and current_row['单品编码'] == previous_row['单品编码'] and current_row['销售类型'] == previous_row['销售类型']:
            current_row['销量(千克)'] = str(float(current_row['销量(千克)']) + float(previous_row['销量(千克)']))

    new_rows.append(current_row)

# 将处理后的数据写入SUMsmall.csv文件
with open('SUMsmall.csv', 'w', newline='') as file:
    fieldnames = ['销售日期', '扫码销售时间', '单品编码', '单品名称', '分类名称', '销量(千克)', '销售单价(元/千克)', '销售类型', '是否打折销售', '批发价格', '单品损耗率']
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerows(new_rows)

Traceback (most recent call last):
  File "I:\math\2.py", line 23, in <module>
    writer.writerows(new_rows)
  File "C:\Users\TX\AppData\Local\Programs\Python\Python39\lib\csv.py", line 157, in writerows
    return self.writer.writerows(map(self._dict_to_list, rowdicts))
  File "C:\Users\TX\AppData\Local\Programs\Python\Python39\lib\csv.py", line 149, in _dict_to_list
    raise ValueError("dict contains fields not in fieldnames: "
ValueError: dict contains fields not in fieldnames: ''

错误原因及解决方法

错误信息: ValueError: dict contains fields not in fieldnames: ''

原因: 该错误是由于在生成 new_rows 时,其中包含了不在 fieldnames 列表中的字段导致的。

解决方法:

  1. 检查 SUM.csv 文件: 检查 SUM.csv 文件中是否包含额外的字段。如果有,需要将这些字段添加到 fieldnames 列表中。
  2. 确保只使用 fieldnames 中定义的字段: 在生成 new_rows 时,只使用 fieldnames 中定义的字段。可以使用以下方法确保这一点:
    • 在生成新的行时,只包含 fieldnames 中的字段。
    • 在生成新的行时,使用 dict.fromkeys(fieldnames, None) 来创建一个新的字典,并使用 fieldnames 中的字段作为键,然后将需要的值填充到对应的键中。

代码优化

为了避免出现错误,建议对代码进行以下优化:

  1. 在生成新的行时,使用 dict.fromkeys(fieldnames, None) 创建一个新的字典,并使用 fieldnames 中的字段作为键,然后将需要的值填充到对应的键中。这样可以确保新的行只包含 fieldnames 中定义的字段。
  2. 可以将 fieldnames 列表定义为一个常量,以便于代码的维护。

示例代码

import csv

FIELDNAMES = ['销售日期', '扫码销售时间', '单品编码', '单品名称', '分类名称', '销量(千克)', '销售单价(元/千克)', '销售类型', '是否打折销售', '批发价格', '单品损耗率']

# 读取SUM.csv文件
with open('SUM.csv', 'r') as file:
    reader = csv.DictReader(file)
    rows = list(reader)

# 处理数据并生成新的行
new_rows = []
for i in range(len(rows)):
    current_row = rows[i]
    if i > 0:
        previous_row = rows[i-1]
        if current_row['销售日期'] == previous_row['销售日期'] and current_row['单品编码'] == previous_row['单品编码'] and current_row['销售类型'] == previous_row['销售类型']:
            current_row['销量(千克)'] = str(float(current_row['销量(千克)']) + float(previous_row['销量(千克)']))
    new_row = dict.fromkeys(FIELDNAMES, None)  # 创建新的字典,确保只包含fieldnames中的字段
    for key, value in current_row.items():
        if key in FIELDNAMES:
            new_row[key] = value
    new_rows.append(new_row)

# 将处理后的数据写入SUMsmall.csv文件
with open('SUMsmall.csv', 'w', newline='') as file:
    writer = csv.DictWriter(file, fieldnames=FIELDNAMES)
    writer.writeheader()
    writer.writerows(new_rows)

总结

通过检查 SUM.csv 文件和确保只使用 fieldnames 中定义的字段,可以解决 ValueError: dict contains fields not in fieldnames 错误。建议对代码进行优化,以提高代码的可读性和可维护性。

Python CSV 数据处理:合并重复行并写入新文件

原文地址: https://www.cveoy.top/t/topic/ejlF 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录