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

python字典,将文件中的每个奇数行设置为键,将偶数行设置为值,python,dictionary,fasta,fastq,Python,Dictionary,Fasta,Fastq,嗨,我有一个这样的文本文件: >NM_145914.2:212 TCTGATGGTAAAAGTCGAGGAGAAAGAAGA >NM_000614.3:1086 ATTCAATTTAAAATCAGACTCTTTAGTTGA >NM_012096.2:2808 CAGTTAAGGTTTCAAATTGTGGCAGGTGGT >NM_173465.3:1682 GTGCGTCGGGTGAGAGAGGCCCCAGCGGCC >NM_001198858.1:490 CAACC

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

>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......
>>> 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'}
我想要的是:

>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......
>>> 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'}
从上面的文件中读取,使第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
代码工作正常,但速度非常慢,因为我的文本文件的最小行数是200000行。有谁有更好的方法来做这件事吗

非常感谢

================增加了后续问题==================

以下是fastq格式,每次读取4行(记录):

我想创建一个字典,在每4行记录中,键是第1行,值是第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}
输出:

>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......
>>> 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'}
更新:

>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......
>>> 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'}
输出:

>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......
>>> 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'}
大概是这样的:

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

>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......
>>> 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'}
更新:

>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......
>>> 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'}
输出:

>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......
>>> 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'}
如果内存有问题,请使用
itertools.islice

{i: j for i, j in zip(islice(s, 0, len(s), 2), islice(s, 1, len(s), 2))}
如果内存有问题,请使用
itertools.islice

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

或者,代替dict comp:

from itertools import izip

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

或者,代替dict comp:

from itertools import izip

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

那是一个FASTA文件。安装Biopython(
pip安装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())
...

那是一个FASTA文件。安装Biopython(
pip安装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())
...

这需要将整个文件读入内存,这通常是一种糟糕的设计,因为它会导致非常大的文件出现问题
itertools.islice()
也不会提高内存效率,除非您使用的是惰性源代码。他所说的文件小于10MB,这不会成为问题。但是你是对的,有更好的方法,我喜欢切片。这需要将整个文件读入内存,这通常是糟糕的设计,因为它会导致非常大的文件出现问题
itertools.islice()
也不会提高内存效率,除非您使用的是惰性源代码。他所说的文件小于10MB,这不会成为问题。但是你是对的,有更好的方法,我只是喜欢切片。+1-如果有工具可以做这项工作,就不要重新发明轮子。是的,这是一个fasta文件。我正在为序列比对工具做一些测试,甚至这些工具会输出一些数字,如“报告的比对、比对率”等。但是我想编写一些python脚本来检查.sam输出文件。我知道biopython和输出提供了很多信息,但这不是我想要的。不过还是要谢谢你。@user2068965:
SeqIO.to_dict(SeqIO.parse(handle,'fasta'))
应该可以用了。谢谢你的回复,你能不能再详细介绍一下:SeqIO.to_dict(SeqIO.parse(handle,'fasta')?哪个是创建的字典?@user2068965:它将序列ID映射到记录。基本上与其他答案是一样的。+1-如果有工作工具,不要重新发明轮子。是的,这是一个fasta文件。我正在为序列比对工具做一些测试,甚至这些工具会输出一些数字,如“报告的比对、比对率”等。但是我想编写一些python脚本来检查.sam输出文件。我知道biopython和输出提供了很多信息,但这不是我想要的。不过还是要谢谢你。@user2068965:
SeqIO.to_dict(SeqIO.parse(handle,'fasta'))
应该可以用了。谢谢你的回复,你能不能再详细介绍一下:SeqIO.to_dict(SeqIO.parse(handle,'fasta')?哪个是创建的字典?@user2068965:它将序列ID映射到记录。基本上和其他答案是一样的。嗨,谢谢你的回答,它起作用了。但我只是想知道如何将fastq格式添加到字典中?fastq格式类似于我上面展示的格式,但每个记录有4行。所以要把它添加到字典中,我需要在每4行中添加第1行(作为键)和第2行(作为值)。嗨,谢谢你的回答,它成功了。但我只是想知道如何将fastq格式添加到字典中?fastq格式类似于我上面展示的格式,但每个记录有4行。所以要将其添加到字典中,我需要在每4行中添加第1行(作为键)和第2行(作为值)。