如何正确处理异常并使用phonenumbers库逐行处理两个电话号码?
问题根源
- 原代码将两个号码的解析、格式化逻辑封装在同一个
try块中,任意步骤抛出异常都会直接触发continue跳过整行后续逻辑,导致另一个正常号码也无法处理 - 存在变量名错误:第二个号码解析后赋值给
num2,但格式化时误写为未定义的y,会额外触发NameError - 裸
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
相关产品推荐
相关产品推荐

