Python CSV 数据处理:合并重复行并写入新文件
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 列表中的字段导致的。
解决方法:
- 检查
SUM.csv文件: 检查SUM.csv文件中是否包含额外的字段。如果有,需要将这些字段添加到fieldnames列表中。 - 确保只使用
fieldnames中定义的字段: 在生成new_rows时,只使用fieldnames中定义的字段。可以使用以下方法确保这一点:- 在生成新的行时,只包含
fieldnames中的字段。 - 在生成新的行时,使用
dict.fromkeys(fieldnames, None)来创建一个新的字典,并使用fieldnames中的字段作为键,然后将需要的值填充到对应的键中。
- 在生成新的行时,只包含
代码优化
为了避免出现错误,建议对代码进行以下优化:
- 在生成新的行时,使用
dict.fromkeys(fieldnames, None)创建一个新的字典,并使用fieldnames中的字段作为键,然后将需要的值填充到对应的键中。这样可以确保新的行只包含fieldnames中定义的字段。 - 可以将
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 错误。建议对代码进行优化,以提高代码的可读性和可维护性。
原文地址: https://www.cveoy.top/t/topic/ejlF 著作权归作者所有。请勿转载和采集!