2

私はpythonが初めてで、複数のシーケンスを含むfastaファイルを読み取り、シーケンスの逆補完を含む新しいfastaファイルを作成する方法を見つけようとしています。ファイルは次のようになります。

>ホモサピエンス ACGTCAGTACGTACGTCATGACGTACGTACTGACTGACTGACTGACGTACTGACTGACTGACGTACGTACGTACGTACGTACGTACTG

>Canis_lupus CAGTCATGCATGCATGCAGTCATGACGTCAGTCAGTACTGCATGCATGCATGCATGCATGACTGCAGTACTGACGTACTGACGTCATGCATGCAGTCATG

>Pan_troglodytus CATGCATACTGCATGCATGCATCATGCATGCATGCATGCATGCATGCATCATGACTGCAGTCATGCAGTCAGTCATGCATGCATCAT

for および while ループの使用方法を学習しようとしているので、ソリューションにそれらのいずれかを組み込むことができれば、それが優先されます。

これまでのところ、次のように非常に洗練されていない方法でそれを行うことができました。

file1 = open('/path/to/file', 'r')

for line in file1:
   if line[0] == '>':
      print line.strip() #to capture the title line
   else:
      import re
      seq = line.strip()
      line = re.sub(r'T', r'P', seq)
      seq = line
      line = re.sub(r'A',r'T', seq)
      seq = line
      line = re.sub(r'G', r'R', seq)
      seq = line
      line = re.sub(r'C', r'G', seq)
      seq = line
      line = re.sub(r'P', r'A', seq)
      seq = line
      line = re.sub(r'R', r'C', seq)
      print line[::-1]

file1.close()

これはうまくいきましたが、その最後の部分を反復するより良い方法があることを私は知っています。より良い解決策はありますか?

4

4 に答える 4

1

これを自分の演習だと考えていることは承知していますが、既存の機能の使用に興味がある場合は、Biopythonパッケージをご覧ください。特に、より多くのシーケンス作業を行う場合。

これにより、eg でシーケンスをインスタンス化できますseq = Seq('GATTACA')。次に、seq.reverse_complement()逆補数を与えます。

逆補体は単に文字列を逆にするだけでなく、ヌクレオチド塩基も同様に補体文字に置き換える必要があることに注意してください。

于 2014-03-03T22:52:41.167 に答える
1

私が正しいと仮定すると、以下のコードはうまくいきますか? 必要な交換を辞書に追加するだけです。

d = {'A':'T','C':'G','T':'A','G':'C'}

with open("seqs.fasta", 'r') as in_file:
    for line in in_file:
        if line != '\n': # skip empty lines
            line = line.strip() # Remove new line character (I'm working on windows)
            if line.startswith('>'):
                head = line
            else:
                print head
                print ''.join(d[nuc] for nuc in line[::-1])

出力:

>homo_sapiens
CAGTACGTACGTACGTACGTACGTACGTCAGTCAGTCAGTACGTCAGTCAGTCAGTCAGTACGTACGTCATGACGTACGT
ACTGACGT
>Canis_lupus
CATGACTGCATGCATGACGTCAGTACGTCAGTACTGCAGTCATGCATGCATGCATGCATGCAGTACTGACTGACGTCATG
ACTGCATGCATGCATGACTG
>Pan_troglodytus
ATGATGCATGCATGACTGACTGCATGACTGCAGTCATGATGCATGCATGCATGCATGCATGCATGATGCATGCATGCAGT
ATGCATG
于 2014-03-03T23:47:40.477 に答える
0

これは文字列反転の簡単な例です。

Python コード

string = raw_input("Enter a string:")
reverse_string = ""

print "our string is %s" % string
print "our range will be %s\n" % range(0,len(string))

for num in range(0,len(string)):

    offset = len(string) - 1
    reverse_string += string[offset - num]

    print "the num is currently: %d" % num
    print "the offset is currently: %d" % offset
    print "the index is currently: %d" % int(offset - num)
    print "the new string is currently: %s" % reverse_string
    print "-------------------------------"

    offset =- 1

print "\nOur reverse string is: %s" % reverse_string

スクリプトで何が起こっているかを表示する印刷コマンドを追加しました。

python で実行して、何が起こるか見てみましょう。

于 2014-03-03T22:38:22.020 に答える
0

通常、テキスト ファイル内の行を反復するには、for ループを使用します。これは、「open」が反復可能なファイル オブジェクトを返すためです。

>>> f = open('workfile', 'w')
>>> print f
<open file 'workfile', mode 'w' at 80a0960>

詳細はこちら

コンテキスト マネージャーを "with" で使用してファイルを開くこともできます。このキー ステートメントはファイル オブジェクトを閉じてくれるので、決して忘れることはありません。

1 つのシーケンス (タイトル、シーケンス、および空白行) を処理するために複数の行を読み取る必要があるため、"for line in f:" ステートメントを含めないことにしました。"readline()" で for ループを使用しようとすると、ValueError が発生します (試してみてください:)

したがって、 string.translateを使用します。このスクリプトは、例を含む「test」という名前のファイルを開きます。

import string

if __name__ == "__main__":

    file_name = "test"
    translator = string.maketrans("TAGCPR", "PTRGAC")
    with open(file_name, "r") as f:
        while True:
            title = f.readline().strip()
            if not title:  # end of file
                break
            rev_seq = f.readline().strip().translate(translator)[::-1]
            f.readline()  # blank line
            print(title)
            print(rev_seq)

出力(あなたの例で):

>homo_sapiens
RPGTPRGTPRGTPRGTPRGTPRGTPRGTRPGTRPGTRPGTPRGTRPGTRPGTRPGTRPGTPRGTPRGTRPTGPRGTPRGTPRTGPRGT
>Canis_lupus
RPTGPRTGRPTGRPTGPRGTRPGTPRGTRPGTPRTGRPGTRPTGRPTGRPTGRPTGRPTGRPGTPRTGPRTGPRGTRPTGPRTGRPTGRPTGRPTGPRTG
>Pan_troglodytus
PTGPTGRPTGRPTGPRTGPRTGRPTGPRTGRPGTRPTGPTGRPTGRPTGRPTGRPTGRPTGRPTGPTGRPTGRPTGRPGTPTGRPTG
于 2014-03-03T23:19:10.767 に答える