You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 19:18:30