2014-01-05 30 views
1

喜價值,我有一個文本文件中像這樣:Python字典,使每一個奇數行向密鑰和偶數行從文件

>NM_145914.2:212 
TCTGATGGTAAAAGTCGAGGAGAAAGAAGA 
>NM_000614.3:1086 
ATTCAATTTAAAATCAGACTCTTTAGTTGA 
>NM_012096.2:2808 
CAGTTAAGGTTTCAAATTGTGGCAGGTGGT 
>NM_173465.3:1682 
GTGCGTCGGGTGAGAGAGGCCCCAGCGGCC 
>NM_001198858.1:490 
CAACCACCACAACCTGCTGGTCTGCTCGGT 
......more lines in same style...... 

我要的是:

從上面的文件中讀取,使行1,3,5,7 ...到字典鍵和行2,4,5,8 ...到字典值。

我的代碼是:

query_dict = {} 
nameAt = 1 
sequenceAt = 2 

while name in range(totalLines): 
line1 = linecache.getline(filename, nameAt) 
line2 = linecache.getline(filename, sequenceAt) 

query_dict[line1] = line2 
nameAt = nameAt + 2   
sequenceAt = sequenceAt + 2 

代碼的工作,但它的速度很慢,因爲我的文本文件的最低線爲20萬線。有沒有人有更好的方法來做到這一點?

非常感謝。

==============添加後續問題==================

這裏是FASTQ格式,與每個讀取(記錄)4行:

@>NM_052972.2:11:1054:1780:889 
CTTCGACATCTCCGGCAACCCCTGGATCTG 
+>NM_052972.2:11:1054:1780:889 
IIIIIIIIIIIIIIIIIIIIIIIIIIIIII 
@>NM_080660.3:12:914:1802:542 
CCTGTATGGCTACTGCAACCTCAAGGATAA 
+>NM_080660.3:12:914:1802:542 
IIIIIIIIIIIIIIIIIIIIIIIIIIIIII 
@>NM_176814.3:712:2706:4242:98 
ACAGAGTAAAAGAGAGGCTGACTTAATAAA 
+>NM_176814.3:712:2706:4242:98 
IIIIIIIIIIIIIIIIIIIIIIIIIIIIII 
...... more lines in same style ...... 

我想創建一個字典,關鍵是第一線和所述值在各4行記錄的第二線。

字典會是什麼樣子:

{'@>NM_052972.2:11:1054:1780:889':'CTTCGACATCTCCGGCAACCCCTGGATCTG', 
'@>NM_080660.3:12:914:1802:542':'CCTGTATGGCTACTGCAACCTCAAGGATAA', 
'@>NM_176814.3:712:2706:4242:98':'ACAGAGTAAAAGAGAGGCTGACTTAATAAA', 
..... more keys and values ...... 
} 

感謝。

回答

5

事情是這樣的:

with open('filename') as f: 
    query_dict = {line.strip():next(f).strip() for line in f} 

輸出:

>>> from pprint import pprint 
>>> pprint(query_dict) 
{'>NM_000614.3:1086': 'ATTCAATTTAAAATCAGACTCTTTAGTTGA', 
'>NM_001198858.1:490': 'CAACCACCACAACCTGCTGGTCTGCTCGGT', 
'>NM_012096.2:2808': 'CAGTTAAGGTTTCAAATTGTGGCAGGTGGT', 
'>NM_145914.2:212': 'TCTGATGGTAAAAGTCGAGGAGAAAGAAGA', 
'>NM_173465.3:1682': 'GTGCGTCGGGTGAGAGAGGCCCCAGCGGCC'} 

更新:

with open('foo.txt') as f: 
    dic = {} 
    for line in f: 
     dic[line.strip()] = next(f).strip() 
     next(f);next(f) #Drop next two lines 
from pprint import pprint 
pprint(dic) 

輸出:

{'@>NM_052972.2:11:1054:1780:889': 'CTTCGACATCTCCGGCAACCCCTGGATCTG', 
'@>NM_080660.3:12:914:1802:542': 'CCTGTATGGCTACTGCAACCTCAAGGATAA', 
'@>NM_176814.3:712:2706:4242:98': 'ACAGAGTAAAAGAGAGGCTGACTTAATAAA'} 
+0

您好,感謝你回答,它的工作。但只是想知道如何將fastq格式添加到字典中?fastq格式與我上面顯示的類似,但每條記錄有4行。所以要添加到字典中,我需要在每4行添加第一行(作爲關鍵字)和第二行(作爲值)。 – Xiangwu

+0

@ user2068965我已更新解決方案。 –

1
>>> s = """>NM_145914.2:212 
... TCTGATGGTAAAAGTCGAGGAGAAAGAAGA 
... >NM_000614.3:1086 
... ATTCAATTTAAAATCAGACTCTTTAGTTGA 
... >NM_012096.2:2808 
... CAGTTAAGGTTTCAAATTGTGGCAGGTGGT 
... >NM_173465.3:1682 
... GTGCGTCGGGTGAGAGAGGCCCCAGCGGCC 
... >NM_001198858.1:490 
... CAACCACCACAACCTGCTGGTCTGCTCGGT""".splitlines() 
>>> {i: j for i, j in zip(s[::2], s[1::2])} 
{'>NM_145914.2:212': 'TCTGATGGTAAAAGTCGAGGAGAAAGAAGA', '>NM_000614.3:1086': 'ATTCAATTTAAAATCAGACTCTTTAGTTGA', '>NM_001198858.1:490': 'CAACCACCACAACCTGCTGGTCTGCTCGGT', '>NM_012096.2:2808': 'CAGTTAAGGTTTCAAATTGTGGCAGGTGGT', '>NM_173465.3:1682': 'GTGCGTCGGGTGAGAGAGGCCCCAGCGGCC'} 

使用itertools.islice如果記憶是一個問題:

{i: j for i, j in zip(islice(s, 0, len(s), 2), islice(s, 1, len(s), 2))} 
+1

這需要將整個文件讀入內存,這通常是不好的設計,因爲它會導致非常大的文件問題。 'itertools.islice()'也不會有更高的內存效率,除非你從懶惰的源代碼工作。 –

+0

他談到的文件不到10MB,這不是問題。但你是對的,有更好的方法,我只是喜歡切片。 – utdemir

3

或者,而不是一個字典-COMP:

from itertools import izip 

with open('somefile') as fin: 
    lines = (line.strip() for line in fin) 
    query_dict = dict(izip(lines, lines)) 
5

這是一個FASTA文件。安裝Biopython(pip install biopython),並對其進行解析:

from Bio import SeqIO 

with open('filename.fasta', 'rU') as handle: 
    for record in SeqIO.parse(handle, 'fasta'): 
     print(record) 

看那條可讀的輸出:

ID: NM_145914.2:212 
Name: NM_145914.2:212 
Description: NM_145914.2:212 
Number of features: 0 
Seq('TCTGATGGTAAAAGTCGAGGAGAAAGAAGA', SingleLetterAlphabet()) 
... 
+3

+1 - 如果有工具可用,不要重新發明輪子。 –

+0

是的,它是一個fasta文件。我正在做序列比對工具的一些測試,即使這些工具會輸出一些數據,比如「報告對齊,比對率」等,但我想編寫一些python腳本來檢查.sam輸出文件。我知道biopython和輸出提供了很多信息,但它不是我想要的。但無論如何感謝。 – Xiangwu

+0

@ user2068965:'SeqIO.to_dict(SeqIO.parse(handle,'fasta'))'應該可以工作。 – Blender

相關問題