Python实现CSV文件手机号格式化并覆写的问题求助
解决CSV文件手机号格式化问题
嗨,我来帮你搞定这个手机号格式化的事儿~先说说你原代码里的几个小问题,然后给你个能正常运行的方案:
原代码的问题点
- 同一文件同时读写冲突:你用同一个
csvfile对象既读又写,这会导致文件指针混乱,数据读不全或者写不对,肯定跑不起来。 - 索引错误:遍历
spotreader的时候,你用了spotreader[1],这是错的——应该是对当前的row里的元素做处理,比如row[1]、row[2]这种。 - 手机号格式化逻辑不对:你的
phone_format函数是把前n-1位用逗号分隔再转横杠,不符合你要的xxx-xxx-xxxx格式(10位手机号分成3-3-4)。
正确的解决方案
第一步:完善手机号格式化函数
我们需要一个能处理10位数字、同时兼容空值的函数:
def format_phone_number(phone): # 先判断是不是有效的10位数字手机号 if phone and phone.isdigit() and len(phone) == 10: # 分成3-3-4的格式 return f"{phone[:3]}-{phone[3:6]}-{phone[6:]}" # 如果是空值或者不符合格式,原样返回 return phone
第二步:正确读写CSV文件
我们先把所有内容读到内存里,处理完再写入文件(小文件这么做最省心),也可以避免读写冲突:
import csv def format_phone_number(phone): if phone and phone.isdigit() and len(phone) == 10: return f"{phone[:3]}-{phone[3:6]}-{phone[6:]}" return phone # 1. 读取原CSV文件内容 rows = [] with open('sample.csv', 'r', newline='', encoding='utf-8') as input_file: reader = csv.reader(input_file) for row in reader: # 处理当前行的每个字段:检查是不是手机号,是就格式化 processed_row = [format_phone_number(field) for field in row] rows.append(processed_row) # 2. 写入处理后的内容(这里可以写回原文件,或者写新文件备份) # 建议先写新文件确认没问题再替换原文件 with open('formatted_sample.csv', 'w', newline='', encoding='utf-8') as output_file: writer = csv.writer(output_file) writer.writerows(rows)
代码说明
- 我们用
newline=''是为了避免CSV写入时出现多余的空行(这是Python csv模块的最佳实践)。 format_phone_number函数会先校验字段:非空、是10位数字才格式化,否则保持原样,完美适配你CSV里的空字段情况。- 先把所有行读入
rows列表,处理完再一次性写入,避免了同一文件读写的冲突。
测试效果
用你给出的示例CSV运行这段代码后,输出的formatted_sample.csv就会和你期望的结果完全一致啦~
内容的提问来源于stack exchange,提问作者Rex
相关产品推荐
相关产品推荐

