如何使用csv.DictWriter处理CSV时跳过空单元格完成数据匿名化
解决方法
你现有代码会填充空单元格的核心原因有两点:
- 没有对单元格值做非空校验,无论值是否为空都会执行赋值操作
defaultdict只要被访问不存在的键(包括空字符串""),就会自动调用工厂函数生成假数据
只需要给每个字段的赋值逻辑加非空判断即可,修改后的完整代码如下:
import csv from faker import Faker from collections import defaultdict # 请替换为你实际的CSV文件路径 filename = "你的原始数据文件.csv" def anonymize(): "对原始数据执行匿名化处理" faker = Faker() names = defaultdict(faker.name) emails = defaultdict(faker.email) with open(filename, "r", encoding="utf-8") as f: # 加newline参数避免生成的CSV出现多余空行 with open(f"{filename}-anonymized_data.csv", "w", encoding="utf-8", newline="") as o: reader = csv.DictReader(f) writer = csv.DictWriter(o, reader.fieldnames) writer.writeheader() for row in reader: # 仅非空单元格执行匿名化替换 if row["adult_First_Name"].strip(): row["adult_First_Name"] = names[row["adult_First_Name"]] if row["child_First_Name"].strip(): row["child_First_Name"] = names[row["child_First_Name"]] if row["Adult - EMAIL ADDRESS"].strip(): row["Adult - EMAIL ADDRESS"] = emails[row["Adult - EMAIL ADDRESS"]] if row["Parent - EMAIL ADDRESS"].strip(): row["Parent - EMAIL ADDRESS"] = emails[row["Parent - EMAIL ADDRESS"]] writer.writerow(row) if __name__ == "__main__": anonymize()
补充说明
- 判断逻辑里加
.strip()是为了过滤仅包含空格、制表符的无效空单元格,如果你只需要跳过完全等于空字符串的单元格,去掉.strip()即可 - 新增的
encoding参数用于避免中文乱码,Windows系统下如果读取文件报错,可以把读取的encoding参数改为gbk - 保留了原代码的映射逻辑:同一个原始姓名/邮箱会对应同一个匿名值,不会出现同个原始值对应多个匿名值的问题
内容的提问来源于stack exchange,提问作者user6248190
相关产品推荐
相关产品推荐

