1

こんにちは、次のようなテキスト ファイルがあります。

>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 行であるため、非常に低速です。誰かがこれを行うためのより良い方法を持っていますか?

どうもありがとう。

==============フォローアップの質問を追加==================

これは、読み取り (レコード) ごとに 4 行の fastq 形式です。

@>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行ごとにキーが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 ......
}

ありがとう。

4

4 に答える 4

6

このようなもの:

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'}
于 2014-01-05T18:12:50.427 に答える
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())
...
于 2014-01-05T18:19:20.120 に答える
3

または、dict-comp の代わりに:

from itertools import izip

with open('somefile') as fin:
    lines = (line.strip() for line in fin)
    query_dict = dict(izip(lines, lines))
于 2014-01-05T18:16:20.803 に答える
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))}
于 2014-01-05T18:14:32.510 に答える