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
相关产品推荐
相关产品推荐

