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

如何正确处理异常并使用phonenumbers库逐行处理两个电话号码?

问题根源

  1. 原代码将两个号码的解析、格式化逻辑封装在同一个try块中,任意步骤抛出异常都会直接触发continue跳过整行后续逻辑,导致另一个正常号码也无法处理
  2. 存在变量名错误:第二个号码解析后赋值给num2,但格式化时误写为未定义的y,会额外触发NameError
  3. 裸except会捕获所有类型异常,容易掩盖代码本身的其他错误,不利于问题排查

修复方案

将两个号码的处理逻辑拆分,各自使用独立的try-except块捕获指定的号码解析异常,两个号码的处理互不影响,单个解析失败不会打断另一个的修正流程。

修复后完整代码

import csv
import phonenumbers

with open('base.csv') as f:
    data = list(csv.reader(f, delimiter=';'))

header_row = data[0]
header_row[8] = "Fixed Home Phone"
header_row[13] = "Fixed Mobile Phone"

# 原代码仅处理前5行数据,如果需要处理全量数据可改为 for row in data[1:]:
for row in data[1:6]:
    # 处理固定电话:单独捕获异常,不影响手机号处理
    try:
        print(f'Original home phone - {row[7]}')
        x = phonenumbers.parse(row[7], "RU")
        row[8] = phonenumbers.format_number(x, phonenumbers.PhoneNumberFormat.E164)
    except phonenumbers.NumberParseException:
        # 解析失败可按需设置默认值,比如保留原始值row[7]、填空字符串或者标记为无效
        row[8] = "无效号码"
        print(f'Home phone {row[7]} parse failed, skipped')
    
    # 处理手机号:单独捕获异常,不影响固定电话处理
    try:
        print(f'Original mobile phone - {row[12]}')
        num2 = phonenumbers.parse(row[12], "RU")
        row[13] = phonenumbers.format_number(num2, phonenumbers.PhoneNumberFormat.E164)
    except phonenumbers.NumberParseException:
        row[13] = "无效号码"
        print(f'Mobile phone {row[12]} parse failed, skipped')

writer = csv.writer(open("base_new.csv", 'w'))
for row in data:
    writer.writerow(row)

补充说明

如果需要解析失败时保留原始号码,只需把异常分支中的row[8] = "无效号码"改为row[8] = row[7],row[13] = "无效号码"改为row[13] = row[12]即可。

内容的提问来源于stack exchange,提问作者Bogdan Mind

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:00:03