← 中文资源

简体中文版本

Python ValueError — int() 的无效字面量

通过识别非数字 token,并显式处理空白与符号,修复 int() 的 ValueError: invalid literal for int() with base 10。

阅读英文原文

症状

本篇指南处理“Python ValueError — int() 的无效字面量”。请从症状出发,按顺序执行诊断,在推进前确认每个假设;随后通过修复与验证步骤闭环。

可观察到的症状包括:

  • Python 抛出 “ValueError: invalid literal for int() with base 10: ‘…’”
  • 对纯数字字符串正常,对含空格或符号的 CSV 单元格失败
  • 看起来像数字的配置值无法转换

诊断

先在隔离环境中复现故障,再按顺序执行以下检查,逐步缩小范围。

步骤 1

python -c "print(int(' 42 '))"

int 能容忍首尾空白;若仍失败,说明 token 含额外字符。

步骤 2

print(repr(raw))

repr 会暴露不可见字符,如不间断空格或尾随逗号。

常见诱因(按出现频率排序):

  • 字符串含空白、货币符号或千位分隔符
  • 向 int() 传入浮点字符串(如 “3.14”)
  • 表单字段的空字符串或 “None” 传到了 int()

根因

int(str) 仅接受可选符号加数字字符,以及首尾空白。任何其他字符、小数点或空字符串都会在转换前抛 ValueError。

修复

先清洗 token(去除空白与分隔符),明确选择 int 还是 float,并用 try/except 或校验辅助函数防护,同时报告出错值。

注意:剔除所有非数字会把 “12abc” 变成 12 并掩盖脏数据;应校验而非静默转换。

def to_int(raw):
    s = str(raw).strip().replace(',', '')
    if not s:
        raise ValueError('empty numeric field')
    try:
        return int(s)
    except ValueError:
        return int(float(s))  # tolerate '3.14' and '3e2'

print(to_int(' 1,024 '))

验证

用原始坏输入重跑,确认得到受控错误或正确解析值;为空白、小数与空字符串补充测试。

修复后补充一条回归测试,复现原始症状,防止问题再次出现。

这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。