使用Python CSV模块写入指定列且不覆盖原有数据的问题
问题分析
原代码的核心问题是:只要uid符合条件就直接覆盖mail字段,完全忽略了原CSV中mail列已有的数据。正确逻辑应该是:仅当原有mail为空/不存在,且uid非空且不含@时,才生成新的mail值;如果原有mail已有内容,直接保留原值。
修正后的代码
import csv def process_csv(input_filename, output_filename): with open(input_filename, 'r') as infile, open(output_filename, 'w', newline='') as outfile: reader = csv.DictReader(infile) # 确保fieldnames包含mail列,原文件已有则不重复添加 fieldnames = reader.fieldnames.copy() if 'mail' not in fieldnames: fieldnames.append('mail') writer = csv.DictWriter(outfile, fieldnames=fieldnames) writer.writeheader() for row in reader: new_row = dict(row) # 先获取原有mail值,默认空字符串 original_mail = new_row.get('mail', '') uid_value = new_row.get('uid', '') # 仅在原有mail为空,且uid符合条件时生成新mail if not original_mail and uid_value and '@' not in uid_value: new_row['mail'] = uid_value + '@this.domain.com' else: # 保留原有mail内容(即使为空) new_row['mail'] = original_mail writer.writerow(new_row) process_csv('input.csv', 'output.csv')
修改说明
- 处理列名时,先检查原文件是否已有
mail列,避免重复添加导致列名冗余 - 优先读取原有
mail值,仅在满足「原有mail为空+uid符合规则」的双重条件时,才生成新的mail值 - 所有场景下都保留原有
mail的内容,彻底杜绝覆盖原有数据的问题
内容的提问来源于stack exchange,提问作者tjw
相关产品推荐
相关产品推荐

