簡體   English   中英

用“從python中的infile分裂線”

[英]splitting lines with " from an infile in 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”。這是我的代碼:

    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)

由於某種原因,開始工作正常但基因沒有捕獲任何東西。 這是輸出:

 48050
 0

我認為這與基因名稱周圍的“”有關,但是如果我在終端上輸入它,它可以正常工作:

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

任何解決方案都會非常感激嗎? 即使它是一種完全不同的方式從每一行捕獲2項數據。 謝謝

這是因為當你循環它時你的文件對象已經耗盡了一次start = set([line.strip().split()[3] for line in r])再次你試圖在這里循環genes = set([line.split('"')[1] 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)

你可以使用正則表達式。

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

您可以將所有行加載到列表中,然后對該列表中的每個項執行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]) 

使用shlex(就像它的shell參數一樣),中和多個空格和引號
不確定它是否更快,但更安全,更好

import shlex
with open(infile, 'r') as f:
    for line in f:
        parts = shlex.split(line.replace(';', ''))
        print parts[3], parts[9]

它無法加載genes的原因是你需要從頭開始重新讀取文件。 以下方法應該有效:

import re

start = set()
genes = set()

with open('input.txt', 'r') as f_input:
    for line in f_input:
        s, g = re.match(r'(?:.*?\s+){3}(\d+).*"(\w+)"', line).groups()
        start.add(s)
        genes.add(g)

print start
print genes

給你輸出:

set(['44160380', '29037032', '103356007', '19563636', '53373540', '52870219', '11839859'])
set(['COL11A1', 'PRPF38A', 'KDM4A', 'C1orf167', 'EMC1', 'GMEB1', 'ECHDC2_dup2'])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM