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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:11:00