Skip to main content
 首页 » 编程设计

python字典,将每个奇数行作为键,偶数行作为文件中的值

2025年05月04日8wayfarer

您好,我有一个这样的文本文件:

>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 

代码有效,但速度非常慢,因为我的文本文件的最少行数是 200,000 行。有没有人有更好的方法来做到这一点?

非常感谢。

==============补充问题==================

这里是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 ...... 

我想创建一个字典,键是第 1 行,值是每 4 行记录中的第 2 行。

字典看起来像:

{'@>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 ...... 
} 

谢谢。

请您参考如下方法:

像这样:

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'}