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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 11:45:04