1

私はPythonを独学しようとしている初心者です。たくさんの数字を含むファイルがあり、それらを整数としてPythonリストに「インポート」したい(または、少なくともそれが私がやりたいと思うことです)。問題が発生しているようですが、それが何であるかがわかりません。私の問題と私が試したコードに関する詳細情報は次のとおりです。

私はDNA配列(例えば、〜150,000文字の文字列)を持っており、pythonをその文字列の特定の位置に移動させ、その位置の左側に150文字を印刷したいと思います。その位置の文字は四角で囲まれていますブラケット、およびその位置の右側にある 150 文字。文字列内の 100 を超える位置に対してこれを行う必要があります。これらのポジションのリストは別のファイルにあります。Biopython には非常に長い文字列を処理するオブジェクトがあることがわかりました。必要な位置を Python に指示すると (たとえば、手動で割り当てる)、この文字列をスライスして正しい出力を取得できます。ここで、この他のファイルからターゲット位置をインポートし、python でそのリストを繰り返し調べて、出力を別のファイルに出力できるようにしたいと考えています。最初の部分は、私が問題を抱えているところです。

入力ファイルをいくつかの異なる形式で試しました。このようなもの:

500,1000,15000

そして、このような別のもの(すべての位置が別々の行にあります):

500

1000

15000

私が読んだ他のいくつかの投稿に基づいて、いくつかのことを試しました。これが1つです:

from Bio import SeqIO
import csv

with open('Results.fa', 'a') as f1:
    Reference = SeqIO.read("GEO5FinalAssembly2SC.fa", "fasta") # Biopython
    DataFile = open('TestFile.csv', 'r')
    DataReader = csv.reader(DataFile)
    SNP = []
    for row in DataReader:
        SNP.append(row)
    for i in SNP:
        IA=i-151  #Creating the intervals
        IB=i-1
        JA=i+1
        JB=i+151
        Fragment = Reference.seq[IA:IB] + "[" + Reference.seq[i] + "]" + Reference.seq[JA:JB]
        F = str(Fragment)      #Need to turn Fragment into a string that can be written
        header = ">MINT_SNP" + str(i) + "\n"
        f1.write(header)
        f1.write(F)
        f1.write("\n")

これはエラーを返します:

Traceback (most recent call last):
  File "./ReferenceSplitter3.py", line 15, in <module>
    IA=i-151  #Creating the intervals
TypeError: unsupported operand type(s) for -: 'list' and 'int'

私もこれを試しました:

from Bio import SeqIO
import csv

with open('Results.fa', 'a') as f1:
    Reference = SeqIO.read("GEO5FinalAssembly2SC.fa", "fasta")
    with open('TestFile.txt', 'r') as Input:
        rows = csv.reader(Input, quoting=csv.QUOTE_NONNUMERIC)
        SNP = [[item for number, item in enumerate(row)] for row in rows]       
    for i in SNP:
        IA=i-151  #Creating the intervals
        IB=i-1
        JA=i+1
        JB=i+151
        Fragment = Reference.seq[IA:IB] + "[" + Reference.seq[i] + "]" + Reference.seq[JA:JB]
        F = str(Fragment)      #Need to turn Fragment into a string that can be written
        header = ">SNP" + str(i) + "\n"
        f1.write(header)
        f1.write(F)
        f1.write("\n")

これにより、同様のエラーが発生します。

Traceback (most recent call last):
  File "./ReferenceSplitter4.py", line 13, in <module>
    IA=i-151  #Creating the intervals
TypeError: unsupported operand type(s) for -: 'list' and 'int'

ただし、この SNP = (500,1000,1500) のように自分で整数のリストを定義すると、問題なく動作するようです。ここで基本的な python の概念が欠けているのではないかと思います。初歩的な質問で申し訳ありませんが、アドバイスいただければ幸いです。

4

2 に答える 2

1

それらがすべてコンマ ( 500,1000,10000) で区切られた同じ行にある入力については、次のように読み取ることができます。

SNP = next(DataReader)

それぞれが異なる行にある入力については、次のようにします。

SNP = []
for row in DataReader:
    SNP.append(row[0])

どちらもSNP、のような数字のリストに設定され、[500, 1000, 15000]その後反復できます。

于 2013-02-06T18:41:56.677 に答える
1

他の誰かが (Biopython を使用して) これを行うことに興味を持っている場合、これは機能するはずです。以下のスクリプトは、SNP 周辺の隣接領域を見つけます。役立つ提案をしてくれた David Robinson に感謝します。

from Bio import SeqIO
import csv

with open('Results.fa', 'a') as f1:
   reference = SeqIO.read("Reference.fa", "fasta")
   datafile = open('TestFile.csv', 'r')
   datareader = csv.reader(datafile)
   positions = next(datareader)
   snp = [int(i) for i in positions] #Convert strings in positions to integers
   for i in snp:
        IA=i-151  #Creating the intervals
        IB=i-1
        JA=i+1
        JB=i+151

        fragment = reference.seq[IA:IB] + "[" + reference.seq[i] + "]" + reference.seq[JA:JB]
        f = str(fragment)      #Need to turn Fragment into a string that can be written
        header = ">SNP" + str(i) + "\n"
        f1.write(header)
        f1.write(f)
        f1.write("\n")
于 2013-02-06T20:22:08.667 に答える