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