1

'>gi|2765658|emb|Z78533.1|CIZ78533 C.irapeanum 5.8S rRNA gene and ITS1 and ITS2 DNA\n'シーケンスからid like を削除するにはどうすればよい ですか?

私はこのコードを持っています:

with open('sequence.fasta', 'r') as f :
    while True:
        line1=f.readline()
        line2=f.readline()
        line3=f.readline()
        if not line3:
            break
        fct([line1[i:i+100] for i in range(0, len(line1), 100)])
        fct([line2[i:i+100] for i in range(0, len(line2), 100)])
        fct([line3[i:i+100] for i in range(0, len(line3), 100)])

出力:

['>gi|2765658|emb|Z78533.1|CIZ78533 C.irapeanum 5.8S rRNA gene and ITS1 and ITS2 DNA\n']
['CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGGAATAAACGATCGAGTG\n']
['AATCCGGAGGACCGGTGTACTCAGCTCACCGGGGGCATTGCTCCCGTGGTGACCCTGATTTGTTGTTGGG\n']
['CCGCCTCGGGAGCGTCCATGGCGGGTTTGAACCTCTAGCCCGGCGCAGTTTGGGCGCCAAGCCATATGAA\n']
['AGCATCACCGGCGAATGGCATTGTCTTCCCCAAAACCCGGAGCGGCGGCGTGCTGTCGCGTGCCCAATGA\n']
['ATTTTGATGACTCTCGCAAACGGGAATCTTGGCTCTTTGCATCGGATGGAAGGACGCAGCGAAATGCGAT\n']
['AAGTGGTGTGAATTGCAAGATCCCGTGAACCATCGAGTCTTTTGAACGCAAGTTGCGCCCGAGGCCATCA\n']
['GGCTAAGGGCACGCCTGCTTGGGCGTCGCGCTTCGTCTCTCTCCTGCCAATGCTTGCCCGGCATACAGCC\n']
['AGGCCGGCGTGGTGCGGATGTGAAAGATTGGCCCCTTGTGCCTAGGTGCGGCGGGTCCAAGAGCTGGTGT\n']
['TTTGATGGCCCGGAACCCGGCAAGAGGTGGACGGATGCTGGCAGCAGCTGCCGTGCGAATCCCCCATGTT\n']
['GTCGTGCTTGTCGGACAGGCAGGAGAACCCTTCCGAACCCCAATGGAGGGCGGTTGACCGCCATTCGGAT\n']
['GTGACCCCAGGTCAGGCGGGGGCACCCGCTGAGTTTACGC\n']
['\n']
...

私の機能は次のとおりです。

def fct(input_string):
    code={"a":0,"c":1,"g":2,"t":3}
    p=[code[i] for i in input_string]
    n=len(input_string)
    c=0

    for i, n in enumerate(range(n, 0, -1)):
        c +=p[i]*(4**(n-1))
        return c+1

fct()文字列から整数を返します。たとえば 、次のようになりACTます8

しかし、関数を使用すると、次のようになります。

KeyError: '>gi|2765658|emb|Z78533.1|CIZ78533 C.irapeanum 5.8S rRNA gene and ITS1 and ITS2 DNA\n' 

行頭を削除して残りをテキストファイルに書き込むことでIDを削除しようとしまし> た。そのため、テキストファイルoutput.txtにはIDのないシーケンスのみが含まれていますが、関数fct を使用すると同じエラーが見つかりました:

KeyError: 'CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGGAATAAACGATCGAGTG\n'

私に何ができる?

4

1 に答える 1

4

あなたのコードには 2 つの大きな問題があります。FASTA シーケンスの解析に問題があり、関数が各シーケンスを適切に反復処理していません。

FASTA データの解析

優れたBiopythonパッケージを使用することをお勧めしますか? 優れた FASTA サポート (読み取りと書き込み) が組み込まれています (チュートリアルのシーケンスを参照してください)。

FASTA ファイルからシーケンスを解析するには:

for seq_record in SeqIO.parse("seqs.fasta", "fasta"):
    print record.description  # gi|2765658|emb|Z78533.1...
    print record.seq  # a Seq object, call str() to get a simple string

>>> print record.id
'gi|2765658|emb|Z78533.1|CIZ78533'

>>> print record.description
'gi|2765658|emb|Z78533.1|CIZ78533 C.irapeanum 5.8S rRNA gene and ITS1 and ITS2 DNA'

>>> print record.seq
Seq('CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGG...CGC', SingleLetterAlphabet())

>>> print str(record.seq)
'CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACC'  #(truncated)

シーケンス データの反復処理

コードには、渡される文字列のリストがありますfct()(input_string実際には文字列ではなく、文字列のリストです)。解決策は、1 つの入力文字列を作成し、それを反復処理することです。

のその他のエラーfct:

  • 辞書のキーは大文字にする必要があります: 大文字と小文字が区別されます
  • for ループのに return ステートメントが必要です。ネストされたままにしておくと、cすぐに返されます。
  • シーケンスを反復処理するときpにインデックスを作成できるのに、わざわざ構築する必要はありません。code
  • ループ内で変数名としてn使用して、シーケンスの長さ ( ) を上書きします。for

コードを修正し (適切なPEP 8フォーマットで)、変数の名前を変更して、その意味をより明確にしました (どうあるべきかはまだわかりませcん):

from Bio import SeqIO


def dna_seq_score(dna_seq):
    nucleotide_code = {"A": 0, "C": 1, "G": 2, "T": 3}

    c = 0 
    for i, k in enumerate(range(len(dna_seq), 0, -1)):
        nucleotide = dna_seq[i]
        code_num = nucleotide_code[nucleotide]
        c += code_num * (4 ** (k - 1)) 
    return c + 1 


for record in SeqIO.parse("test.fasta", "fasta"):
    dna_seq_score(record.seq)
于 2013-07-30T00:00:50.500 に答える