Python CSV文件移除姓氏功能失效:问题排查与解决请求
CSV文件姓名列去姓氏问题排查与修复
问题背景
需要处理CSV文件,从姓名列移除姓氏仅保留名字,但运行提供的Python代码后,生成的修改文件内容完全无变化。CSV输入用分号;分隔,示例输入和期望输出如下:
输入示例:
Name;Firstname Secondname;10EH2; Name;Firstname-Secondname;10EH3; Name;Firstname Secondname OtherName;10EH3;期望输出:
Name;Firstname;10EH2; Name;Firstname;10EH3; Name;Firstname;10EH3;
错误原因分析
- 分隔符不匹配:你的CSV文件用分号
;作为列分隔符,但代码里的csv.reader和csv.writer都指定了delimiter='\t'(制表符)。这会导致CSV读取器把整行内容当成单个单元格,row的长度始终为1,永远不会触发len(row)>=2的修改逻辑,自然不会有任何内容变化。 - 姓名拆分逻辑不全:原代码只处理了空格分隔的姓名,但输入里存在
Firstname-Secondname这种连字符连接的情况,按空格拆分无法提取出纯名字。 - 冗余代码:循环里的
rows[i] = row是多余的——因为row是列表的引用,直接修改row[1]就会同步到rows列表中,这行代码不会造成错误,但没必要保留。
修复后的代码
import csv import os def remove_second_names(full_name): # 先按空格拆分,取第一部分 name_part = full_name.split()[0] # 再按连字符拆分,取第一部分(处理Firstname-Secondname的情况) first_name = name_part.split('-')[0] # 统一首字母大写,其余小写的格式 first_name = first_name[0].upper() + first_name[1:].lower() return first_name csv_file_path = input("请输入CSV文件路径: ") try: # 把分隔符改成CSV实际使用的分号; with open(csv_file_path, 'r', newline='', encoding='utf-8') as file: reader = csv.reader(file, delimiter=';') rows = list(reader) # 遍历每行,修改姓名列(索引1) for row in rows: # 确保行有足够的列数,避免索引越界 if len(row) >= 2: row[1] = remove_second_names(row[1]) base_file_name = os.path.basename(csv_file_path) output_file_path = base_file_name.replace('.csv', '_处理后.csv') # 写入时同样用分号作为分隔符 with open(output_file_path, 'w', newline='', encoding='utf-8') as file: writer = csv.writer(file, delimiter=';') writer.writerows(rows) print(f"处理后的数据已写入文件: {output_file_path}") except FileNotFoundError: print("指定的文件未找到。") except Exception as e: print(f"发生错误: {str(e)}")
修复说明
- 将
csv.reader和csv.writer的delimiter参数改为;,匹配CSV文件的实际分隔符。 - 优化姓名拆分逻辑:先按空格取第一部分,再按连字符取第一部分,覆盖两种姓名格式。
- 移除冗余的
rows[i] = row代码,简化逻辑。 - 添加
encoding='utf-8'参数,避免中文或特殊字符出现编码问题。
内容的提问来源于stack exchange,提问作者user20775003
相关产品推荐
相关产品推荐

