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

Python创建BED文件报错:TypeError参数类型不匹配

问题根源

你遇到的TypeError是因为:

  • 你将已打开的文件对象(simple_repeats_file、gaps_file)传入了read_bed函数,但该函数期望接收的是文件路径字符串(如"simpleRepeats.bed"),open()函数只能接收路径类参数,不能直接接收已打开的文件对象。
  • 额外问题:你用"w"模式打开这两个文件是错误的——你需要读取它们,而非写入,"w"模式会清空文件内容,还会导致后续无法正常读取。
  • 次要问题:Python3中没有dict.iteritems()方法,需改为dict.items(),否则会触发另一个报错。
修复后的完整代码
#!/usr/bin/python

import os
import random
import pathlib

pick_random = 100000
mask_regions = dict()

genome = {
    'chr01' : 41767771,
    'chr02' : 34826099,
    'chr03' : 43931233,
    'chr04' : 45086258,
    'chr05' : 46513039,
    'chr06' : 43117521,
    'chr07' : 39373400,
    'chr08' : 51314288,
    'chr09' : 47719527,
    'chr10' : 40511255,
    'chr11' : 34663808
}

genome_length = sum(genome.values())

# 改为存储文件路径字符串,而非打开的文件对象
simple_repeats_file = "simpleRepeats.bed"
gaps_file = "gap.bed"

def read_bed(file_path):
    with open(file_path, "r") as bed:
        for line in bed:
            line = line.rstrip()
            chr, start, end = line.split("\t")
            chr = chr.replace('chr','')
            if chr == 'X':
                chr = 23
            try:
                chr = int(chr)
            except:
                continue
            # 转换为genome字典匹配的key格式
            chr_str = f'chr{chr:02d}' if chr !=23 else 'chrX'
            if chr_str not in genome:
                continue
            if chr_str not in mask_regions:
                mask_regions[chr_str] = dict()
            start_int = int(start)
            end_int = int(end)
            if start_int not in mask_regions[chr_str]:
                mask_regions[chr_str][start_int] = set()
            mask_regions[chr_str][start_int].add(end_int)

read_bed(simple_repeats_file)
read_bed(gaps_file)

random_positions = dict()

while len(random_positions.keys()) < pick_random:
    randnum = random.randrange(1, genome_length)
    tmp_length = 0
    # Python3中用items()替代iteritems()
    for chr, chrlength in sorted(genome.items()):
        if randnum < tmp_length + chrlength:
            randchr = chr
            randpos = randnum - tmp_length
            break
        tmp_length += chrlength
    
    mask = False
    if randchr in mask_regions:
        for mask_start in sorted(mask_regions[randchr]):
            if randpos < mask_start:
                break
            for mask_end in sorted(mask_regions[randchr][mask_start]):
                if randpos <= mask_end:
                    mask = True
                    break
            if mask:
                break
    if not mask:
        random_positions[f"{randchr}\t{randpos}\t{randpos+1}"] = 1

print("\n".join(random_positions.keys()))
额外优化说明
  • 将mask_regions中存储结束位置的结构从字典改为集合,更符合存储唯一值的需求,减少冗余。
  • 修正了染色体编号的转换逻辑,确保和genome字典的key格式一致,避免之前的判断失效。

内容的提问来源于stack exchange,提问作者Martika

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 16:31:15