我有一系列输入文件,例如:
chr1 hg19_refFlat exon 44160380 44160565 0.000000 + . gene_id "KDM4A"; transcript_id "KDM4A";
chr1 hg19_refFlat exon 19563636 19563732 0.000000 - . gene_id "EMC1"; transcript_id "EMC1";
chr1 hg19_refFlat exon 52870219 52870551 0.000000 + . gene_id "PRPF38A"; transcript_id "PRPF38A";
chr1 hg19_refFlat exon 53373540 53373626 0.000000 - . gene_id "ECHDC2"; transcript_id "ECHDC2_dup2";
chr1 hg19_refFlat exon 11839859 11840067 0.000000 + . gene_id "C1orf167"; transcript_id "C1orf167";
chr1 hg19_refFlat exon 29037032 29037154 0.000000 + . gene_id "GMEB1"; transcript_id "GMEB1";
chr1 hg19_refFlat exon 103356007 103356060 0.000000 - . gene_id "COL11A1"; transcript_id "COL11A1";
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我试图从每一行捕获2个元素,第一个是它表示外显子之后的数字,第二个是基因(由""包围的数字和字母组合,例如"KDM4A".这是我的代码:
with open(infile,'r') as r:
start = set([line.strip().split()[3] for line in r])
genes = set([line.split('"')[1] for line in r])
print len(start)
print len(genes)
Run Code Online (Sandbox Code Playgroud)
由于某种原因,开始工作正常但基因没有捕获任何东西.这是输出:
48050
0
Run Code Online (Sandbox Code Playgroud)
我认为这与基因名称周围的""有关,但是如果我在终端上输入它,它可以正常工作:
>>> x = 'A b P "G" m'
>>> x
'A b P "G" m'
>>> x.split('"')[1]
'G'
>>>
Run Code Online (Sandbox Code Playgroud)
任何解决方案都会非常感激吗?即使它是一种完全不同的方式从每一行捕获2项数据.谢谢
这是因为当你在这里循环它时你的文件对象已经耗尽了一次start = set([line.strip().split()[3] for line in r]),你试图在这里循环genes = set([line.split('"')[1] for line in r])使用耗尽的文件对象
解:
你可以寻找文件的开头(这是解决方案之一)
修改代码:
with open(infile,'r') as r:
start = set([line.strip().split()[3] for line in r])
r.seek(0, 0)
genes = set([line.split('"')[1] for line in r])
print len(start)
print len(genes)
Run Code Online (Sandbox Code Playgroud)