如何用Python+openpyxl提取Excel中含价格变动的产品数据?
处理字符串价格并提取价格变动产品的方案
1. 先将字符串价格转换为数值类型
因为openpyxl读取的单元格值都是字符串,首先得把价格相关的字符串转成可比较的数值(推荐用decimal.Decimal处理货币,避免浮点精度丢失;简单场景也可用float)。
转换代码示例:
from openpyxl import load_workbook import decimal wb = load_workbook('BEVANDE.xlsx') ws = wb.active # 假设价格在第3列(C列,索引从1开始),跳过表头从第2行开始遍历 for row in ws.iter_rows(min_row=2): product_name = row[0].value price_str = row[2].value # 处理欧洲式逗号小数点,转成Decimal类型 try: price = decimal.Decimal(price_str.replace(',', '.')) except (ValueError, TypeError): price = None # 标记无效价格 print(product_name, price, type(price))
注:如果你的价格用
.做小数点,直接decimal.Decimal(price_str)即可。
2. 用if语句判断价格变动
根据常见的数据结构,分两种场景处理:
场景1:每行包含「原价」和「现价」列
假设第3列是原价,第4列是现价,直接对比转换后的数值是否不等:
for row in ws.iter_rows(min_row=2): product_name = row[0].value original_price_str = row[2].value new_price_str = row[3].value try: original_price = decimal.Decimal(original_price_str.replace(',', '.')) new_price = decimal.Decimal(new_price_str.replace(',', '.')) except (ValueError, TypeError): continue # 跳过价格无效的行 # 判断价格是否变动 if original_price != new_price: print(f"价格变动产品:{product_name}") print(f"原价:{original_price},现价:{new_price}") # 此处可将数据存入列表或写入文件
场景2:同一产品有多行价格记录(需追踪初始价格)
用字典记录每个产品的首次价格,后续行对比价格是否变化:
product_prices = {} changed_products = [] for row in ws.iter_rows(min_row=2): product_name = row[0].value price_str = row[2].value try: current_price = decimal.Decimal(price_str.replace(',', '.')) except (ValueError, TypeError): continue # 首次遇到该产品,记录初始价格 if product_name not in product_prices: product_prices[product_name] = current_price else: # 对比当前价格与初始价格 if current_price != product_prices[product_name]: if product_name not in changed_products: changed_products.append(product_name) print(f"价格变动产品:{product_name}") print(f"初始价格:{product_prices[product_name]},当前价格:{current_price}")
3. 关键注意事项
- 异常处理:必须加
try-except捕获转换错误,避免因空值或非数字字符串导致程序崩溃。 - 精度问题:优先用
decimal.Decimal代替float,浮点数的精度误差会影响价格比较结果(比如0.1+0.2≠0.3)。 - 表头处理:确保
min_row设置正确,跳过表头行,避免转换表头字符串出错。
内容的提问来源于stack exchange,提问作者OHICT
相关产品推荐
相关产品推荐

