1

私はPythonを使用するのはかなり初めてで、大好きです。しかし、私はこの問題で立ち往生しており、私が見逃しているものについて教えていただければ幸いです.

Excel ファイルに遺伝子 ID のリストがあり、xrld と biopython を使用してシーケンスを取得し、(fasta 形式で) 結果をテキスト ドキュメントに保存しようとしています。これまでのところ、私のコードではシェルで結果を確認できますが、ドキュメントの最後のシーケンスしか保存されません。

これは私のコードです:

import xlrd
import re
book = xlrd.open_workbook('ids.xls')
sh = book.sheet_by_index(0)
for rx in range(sh.nrows):
    if sh.row(rx)[0].value:
        from Bio import Entrez
        from Bio import SeqIO
        Entrez.email = "mail@xxx.com"
        in_handle = Entrez.efetch(db="nucleotide", rettype="fasta", id=sh.row(rx)[0].value)
        record = SeqIO.parse(in_handle, "fasta")
        for record in SeqIO.parse(in_handle, "fasta"):
            print record.format("fasta")
        out_handle = open("example.txt", "w")
        SeqIO.write(record, out_handle, "fasta")
        in_handle.close()
        out_handle.close() 

前述したように、ファイル「example.txt」には、シェルを示す最後のシーケンス (fasta 形式) しかありません。

同じドキュメントで NCBI から取得したすべてのシーケンスを取得する方法を教えてください。

どうもありがとうございました

アントニオ

4

2 に答える 2

0

私はPythonにもかなり慣れていませんが、それも大好きです! これは質問に答える最初の試みですが、ループ構造と「w」モードが原因でしょうか? 以下のように ("example.txt", "w") を追加モード ("example.txt", "a") に変更してみてはいかがでしょうか?

import xlrd
import re
book = xlrd.open_workbook('ids.xls')
sh = book.sheet_by_index(0)
for rx in range(sh.nrows):
    if sh.row(rx)[0].value:
        from Bio import Entrez
        from Bio import SeqIO
        Entrez.email = "mail@xxx.com"
        in_handle = Entrez.efetch(db="nucleotide", rettype="fasta", id=sh.row(rx)[0].value)
        record = SeqIO.parse(in_handle, "fasta")
        for record in SeqIO.parse(in_handle, "fasta"):
            print record.format("fasta")
        out_handle = open("example.txt", "a")
        SeqIO.write(record, out_handle, "fasta")
        in_handle.close()
        out_handle.close() 
于 2013-01-25T14:08:55.323 に答える
0

もうすぐ友達!

問題は、For ループが各ループでファイルを閉じ続けることです。また、コードを高速化するだけの小さな問題もいくつか修正しました (たとえば、ループごとに Bio をインポートし続けました)。

次の新しいコードを使用します。

out_handle = open("example.txt", "w")
import xlrd
import re
from Bio import Entrez
from Bio import SeqIO
book = xlrd.open_workbook('ids.xls')
sh = book.sheet_by_index(0)
for rx in range(sh.nrows):
    if sh.row(rx)[0].value:
        Entrez.email = "mail@xxx.com"
        in_handle = Entrez.efetch(db="nucleotide", rettype="fasta", id=rx)
        record = SeqIO.parse(in_handle, "fasta")
        SeqIO.write(record, out_handle, "fasta")
        in_handle.close()
out_handle.close()

それでもエラーになる場合は、Excel ファイルに問題があるはずです。エラーがまだ解決しない場合は、これを送ってください。私がお手伝いします:)

于 2013-11-24T06:14:43.627 に答える