使用csv.DictReader读取TSV文件写入字典后条目数少于行数问题
你的猜测完全正确,这是Python字典的键唯一性特性导致的问题。
根因说明
Python字典不允许存在重复键,当你用重复的Strain ID作为键执行赋值操作时,新的赋值会直接覆盖该键已有的旧值,不会新增字典条目。
你做的分段测试刚好可以印证这个判断:重复的Strain ID分别分布在文件的前半段和后半段,单独读取任意一段时不会出现重复键,因此条目数和文件行数一致;合并读取全文件时,后半段出现的重复Strain ID会覆盖前半段的对应条目,最终字典条目数就会少于文件行数。
重复键验证
你可以运行以下代码统计重复键的数量,确认是否和你缺失的条目数匹配:
import csv strains = {} # 存储所有重复出现的Strain ID duplicate_keys = [] with open("mutation_barcodes") as file: reader = csv.DictReader(file, delimiter="\t") for row in reader: key = row['strain'] value = row['barcode'] if key in strains: duplicate_keys.append(key) strains[key] = value print(f"重复Strain ID数量:{len(duplicate_keys)}") print(f"字典实际条目数:{len(strains)}") print(f"文件数据行总数(不含表头):{len(strains) + len(duplicate_keys)}")
适配方案
你可以根据业务需求选择对应的处理逻辑:
- 如果你需要保留所有行的记录,允许一个
Strain ID对应多个Barcode,可以用列表存储同一个键的所有值:
import csv from collections import defaultdict strains = defaultdict(list) with open("mutation_barcodes") as file: reader = csv.DictReader(file, delimiter="\t") for row in reader: strains[row['strain']].append(row['barcode'])
- 如果你需要保证
Strain ID唯一,需要先根据业务规则确认重复Strain ID的处理逻辑:保留首次出现的值、保留末次出现的值,或是根据Barcode的有效性筛选,对应调整赋值逻辑即可。
内容的提问来源于stack exchange,提问作者basedorange
相关产品推荐
相关产品推荐

