用"从python中的infile分裂线"

use*_*260 5 python split

我有一系列输入文件,例如:

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项数据.谢谢

The*_*nse 8

这是因为当你在这里循环它时你的文件对象已经耗尽了一次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)