在python中用“from an infie”拆分线

2024-06-28 11:23:02 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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";

在我的代码中,我试图从每一行中捕获2个元素,第一个是数字,后面写的是外显子,第二个是基因(数字和字母组合,用“”括起来,例如“KDM4A”)。这是我的代码:

^{pr2}$

由于某些原因,start工作得很好,但基因并不能捕获任何东西。输出如下:

 48050
 0

我想这和基因名周围的“”有关,但如果我在终端上输入这个,效果很好:

>>> x = 'A b P "G" m'
>>> x
'A b P "G" m'
>>> x.split('"')[1]
'G'
>>> 

有什么解决办法吗?即使这是一种完全不同的方式从每行捕获2项数据。谢谢


Tags: id基因transcriptchr1genehg19exonemc1
3条回答

您可以将所有行加载到一个列表中,然后对该列表中的每个项执行split(如果文件很长,则不确定效率如何)

with open(infile) as r:
    lines = [line for line in r]
    start = set([line.strip().split()[3] for line in lines])
    genes = set([line.split('"')[1] for line in lines]) 

您可以使用regex。在

with open(file) as f:
    start = []
    genes = []
    for line in f:
        st, gen = re.search(r'\bexon\s+(\d+)\b.*?\s+gene_id\s+"([^"]*)"', line).groups()
        start.append(st)
        genes.append(gen)
    print set(start)
    print set(genes)

DEMO

这是因为当你在这里循环一次文件对象时,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)

相关问题 更多 >