我将深入研究解释我的编程问题:我有两个文件;文件#1是基因注释文件,文件#2是基本位置文件计数(只是试图给出问题的某些上下文)。
我想在第6列中有“+”的行中提取“start_codon”位置,然后转到文件#2中的那个位置。例如,我想从文件#1中的第3列中提取954并转到文件#2中的第954行。然后,我想计算第954行以上的行数,这些行在文件#2中产生70或更大的计数值。
File#1
Chromosome exon 337 774 0.0 - . gene_id "A";
Chromosome start_codon 954 956 0.0 + 0 gene_id "B";
Chromosome stop_codon 2502 2504 0.0 + 0 gene_id "B";
File#2
. .
. .
942 71
943 63
944 88
945 80
946 80
947 85
948 86
949 97
950 97
951 97
952 104
953 105
954 104
955 108
我的最终输出文件将是一个以制表符分隔的gene_id文件,后跟产生计数值为70或更大的行数。对于我给出的示例文件,输出如下:
Gene_id Count_before_start_codon
B 10
我想遍历大文件以生成一个长输出文件。
谢谢,我希望这很清楚。我感谢任何指导!
答案 0 :(得分:0)
如果你想保持简单并假设文件2不是很大,你可以将文件2加载到一个numpy数组中,这样你就可以非常快速地访问任何位置。例如,如果将其加载到数组ar并想要在位置p之前搜索,则可以执行以下操作:
numpy.sum(ar[:p]>=70)
这将为您提供您正在寻找的号码
然后你可以浏览文件#1并动态进行计算。这样你只需要读取一次文件,它应该很快。
答案 1 :(得分:0)
这应该有用...... 第一部分获取文件1中的基因信息并填充字典 第二部分打开文件2,检查字典并生成输出。
D={}
with open("file1.txt","rU") as f1:
for line in f1:
line=line.rstrip().rsplit("\t")
if line[6]=="+" and line[2]=="start_codon":
D[line[3]] = line[8].rstrip('"')[9]
keys = D.keys()
count=[]
results=[]
number = 12
with open("file2.txt","rU") as f2:
for line in f2:
line=line.rstrip().rsplit("\t")
if int(line[1]) >= 70:
count.append(line[1])
if line[0] in D:
results.append(D[line[0]])
if len(count) > number:
results.append(str(number))
else:
results.append(str(len(count)-1))
print "\t".join(results)
count=[]
else:
count=[]
PS。我复制粘贴你的例子。我编辑了文件以制表符分隔。所以你可能需要玩“切片”