文件test7-10.csV以CSV文件格式存储了若干商品销售数据,宇段名依次为:编号、商品名称,单价、数量,每种商品有多条记录。 编写一个程序,汇总每种商品的销售总量和总金额,按编号排序后,写入CSV文件test7-10-2.csv,写入字段名依次为:编号、商品名称、总数量、总金额。 test7-10.csv文件部分内容如下: 網号,商品名称,单价,数量 85,波型,5.0,6 62,香無,2.8,15 距 懸目列表
时间: 2023-10-09 22:08:14 浏览: 127
以下是Python代码实现:
```python
import csv
# 读取CSV文件
with open('test7-10.csv', 'r') as file:
reader = csv.reader(file)
# 跳过第一行(字段名)
next(reader)
# 初始化字典,用于保存每种商品的销售总量和总金额
summary = {}
for row in reader:
# 从CSV文件中读取每条记录的编号、商品名称、单价和数量
code, name, price, quantity = row
# 将单价和数量转换为浮点数
price = float(price)
quantity = int(quantity)
# 如果当前商品编号已经在字典中,则更新销售总量和总金额
if code in summary:
total_quantity, total_amount = summary[code]
total_quantity += quantity
total_amount += price * quantity
summary[code] = (total_quantity, total_amount)
# 如果当前商品编号不在字典中,则添加新的键值对
else:
summary[code] = (quantity, price * quantity)
# 将汇总结果按编号排序,并写入新的CSV文件
with open('test7-10-2.csv', 'w', newline='') as file:
writer = csv.writer(file)
# 写入字段名
writer.writerow(['编号', '商品名称', '总数量', '总金额'])
# 按编号排序
sorted_keys = sorted(summary.keys())
for code in sorted_keys:
name = '' # 商品名称默认为空
# 在原始CSV文件中查找当前商品编号对应的商品名称
with open('test7-10.csv', 'r') as f:
r = csv.reader(f)
next(r)
for row in r:
if row[0] == code:
name = row[1]
break
# 获取当前商品的销售总量和总金额
total_quantity, total_amount = summary[code]
# 写入一行记录
writer.writerow([code, name, total_quantity, total_amount])
```
解释一下代码的实现过程:
1. 首先使用`csv.reader`读取原始CSV文件`test7-10.csv`,跳过第一行(字段名),然后遍历每条记录,读取其中的编号、商品名称、单价和数量,并将单价和数量转换为浮点数和整数。
2. 使用一个字典`summary`来保存每种商品的销售总量和总金额,字典的键为商品编号,值为二元组`(total_quantity, total_amount)`,分别表示销售总量和总金额。
3. 遍历每条记录,如果当前商品编号已经在字典中,则更新对应的销售总量和总金额;如果当前商品编号不在字典中,则添加新的键值对。
4. 遍历完所有记录后,使用`sorted`函数按键(即商品编号)排序,然后遍历排好序的键,依次获取对应的商品名称、销售总量和总金额,并使用`csv.writer`写入新的CSV文件`test7-10-2.csv`,同时写入字段名(第一行)。
注意,在第4步中,需要在原始CSV文件中查找当前商品编号对应的商品名称,因为在汇总字典中只保存了销售总量和总金额,没有保存商品名称。为了实现这个功能,我们在内层循环中使用了一个新的`csv.reader`对象来读取原始CSV文件,跳过了第一行(字段名),然后遍历所有记录,查找当前商品编号对应的商品名称。如果找到了,则将商品名称保存到变量`name`中,并立即退出内层循环(因为每个商品编号对应的商品名称应该是唯一的)。如果没有找到,则默认将商品名称设为空字符串。
阅读全文