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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:18:00