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

Python读取Excel多格式小数转换异常及CSV导出问题求助

解决Excel读取与CSV导出的数值格式问题

问题分析

读取Excel时指定dtype=object仍无法阻止数值列自动转换,同时存在多种数值格式(如10000,25、10.000,25、4,197,214.82),处理后导出CSV出现格式错误:46420370,25被转为4642037025.0,部分数值格式不符合「无千分点、逗号为小数分隔符」的预期。

解决方案

1. 强制读取为字符串

使用converters参数强制目标列以字符串格式读取,避免pandas自动解析数值导致格式丢失:

# 替换target_cols为需要处理的列名列表
df = pd.read_excel(ruta_origen, sheet_name=sheet, converters={col: str for col in target_cols})

2. 统一数值格式

编写自定义函数处理不同格式的数值字符串,确保输出为「无千分位+逗号小数分隔符」的格式:

def clean_numeric(s):
    s = str(s).strip()
    if not s:
        return '0,00'
    
    # 根据最后出现的分隔符判断小数分隔符
    if ',' in s and '.' in s:
        if s.rfind(',') > s.rfind('.'):
            # 逗号是小数分隔符,移除千分位的点
            integer_part, decimal_part = s.rsplit(',', 1)
            integer_part = integer_part.replace('.', '')
        else:
            # 点是小数分隔符,移除千分位的逗号
            integer_part, decimal_part = s.rsplit('.', 1)
            integer_part = integer_part.replace(',', '')
        return f"{integer_part},{decimal_part.ljust(2, '0')[:2]}"
    elif ',' in s:
        integer_part, decimal_part = s.rsplit(',', 1)
        return f"{integer_part},{decimal_part.ljust(2, '0')[:2]}"
    elif '.' in s:
        integer_part, decimal_part = s.rsplit('.', 1)
        return f"{integer_part},{decimal_part.ljust(2, '0')[:2]}"
    else:
        # 整数补两位小数
        return f"{s},00"

# 对目标列批量应用处理函数
for col in target_cols:
    df[col] = df[col].apply(clean_numeric)

3. 导出CSV

直接导出处理后的字符串列,无需指定decimal参数(格式已通过字符串处理完成):

df.to_csv('file.csv', sep='|', index=False, header=True)

说明

  • 强制读取为字符串可完整保留Excel单元格的原始显示格式,避免pandas错误解析数值。
  • 自定义函数通过判断最后出现的分隔符,准确区分千分位符号和小数分隔符,统一输出格式。
  • 最终以字符串格式导出,完全匹配「无千分点、逗号为小数分隔符」的需求。

内容的提问来源于stack exchange,提问作者J. Mendoza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 16:35:38