这段代码实现了从all.txt文件中提取手机号码并保存到out.txt文件的功能。以下是对代码的详细解析:
文件读取:
使用with open语句以只读模式打开all.txt文件,并指定编码为gb18030(兼容中文编码),同时设置errors='ignore'以忽略可能的编码错误。
如果文件读取过程中出现异常,捕获异常并打印错误信息,同时将content变量设为空字符串。
正则表达式匹配:
定义正则表达式模式r'1[3-9]d{9}',用于匹配中国大陆的手机号码:
1:手机号码以1开头。
[3-9]:第二位数字为3到9之间的任意数字。
d{9}:后面跟着9位数字。
使用re.findall方法查找所有匹配的手机号码,返回一个列表phone_numbers。
文件写入:
使用with open语句以写入模式打开out.txt文件,并指定编码为utf-8。
遍历phone_numbers列表,将每个手机号码写入文件,每个号码占一行。
如果文件写入过程中出现异常,捕获异常并打印错误信息。
结果输出:
打印提取到的手机号码数量,提示用户操作完成。
代码优化建议:- 去重处理:如果需要去除重复的手机号码,可以在写入文件前对phone_numbers列表使用set()去重,然后再转换回列表。
- 格式验证:可以增加对手机号码格式的验证,例如检查长度是否为11位。
- 日志记录:使用日志模块(如logging)替代print语句,以便更好地记录程序运行状态和错误信息。
优化后的代码示例:import re# 读取 all.txt 文件内容try: with open('all.txt', 'r', encoding='gb18030', errors='ignore') as f: content = f.read()except Exception as e: print(f'[Error] 读取 all.txt 文件时出错:{e}') content = ''# 使用正则表达式匹配手机号码pattern = r'1[3-9]d{9}'phone_numbers = re.findall(pattern, content)# 去重处理unique_phone_numbers = list(set(phone_numbers))# 将手机号码写入 out.txt 文件try: with open('out.txt', 'w', encoding='utf-8') as f: for phone_number in unique_phone_numbers: f.write(phone_number + 'n')except Exception as e: print(f'[Error] 写入 out.txt 文件时出错:{e}')print(f'已将 {len(unique_phone_numbers)} 个手机号码保存到 out.txt 文件。')注意事项:- 确保all.txt文件与脚本在同一目录下,或提供正确的文件路径。
- 如果手机号码格式有特殊要求(如包含区号或分隔符),需要调整正则表达式模式。