3

基本的に次のようなFASTA形式のシーケンスを使用したデータセットがあります。

>pc284  
ATCGCGACTCGAC

>pc293  
ACCCGACCTCAGC

各タグを辞書のキーとして使用し、遺伝子を値として保存したいと思います。

これは私が持っているコードですが、実際には何もしていません。

import re
fileData = open('d.fasta', 'r')

myDict = dict()

for line in fileData:
  match = re.search('(\>)(\w+)(\r)(\w+)', line)
  if match: 
    gene = match.group(3)
    myDict[gene[0]] = gene[1]

print myDict
4

4 に答える 4

2

\r\sは有効な文字クラスではありません。代わりに使用するつもりだったと思います。どちらも使用しない場合は、グループを減らすことができます。

しかし、何よりも、グループを正しく抽出する必要があります。

match = re.search(r'>(\w+)\s+(\w+)', line)
if match:
    tag, gene = match.groups()
    myDict[tag] = gene

2つのキャプチャグループのみを作成することで、これら2つをより簡単に抽出し、2つの変数と.groups()に直接割り当てることができます。taggene

ただし、FASTA形式を読むと、これは1行にタグがあり、その後は複数行に遺伝子データがある複数行の形式であることがわかります。その場合、あなた\rは改行と一致するように意図されていました。一度に1行ずつファイルを読み取るため、これは機能しません。

次のような正規表現を使用せずに、その形式を読み取る方がはるかに簡単です。

myDict = {}

with open('d.fasta', 'rU') as fileData:
    tag = None
    for line in fileData:
        line = line.strip()
        if not line:
            continue
        if line[0] == '>':
            tag = line[1:]
            myDict[tag] = ''
        else:
            assert tag is not None, 'Invalid format, found gene without tag'
            myDict[tag] += line

print myDict

これにより、ファイルが1行ずつ読み取られ、開始>文字に基づいてタグが検出されます。次に、遺伝子情報の複数の行が読み取られ、最近読み取られたタグの下で辞書に収集されます。

rUモードに注意してください。Pythonのユニバーサル改行モードを使用してファイルを開き、ファイルの作成に使用された改行規則を処理します。

少なくとも最後のではなく; BioPyプロジェクトを見てください; それらのBio.SeqIOモジュールは、FASTAに加えて他の多くのフォーマットを完全に処理します。

于 2012-09-26T22:45:05.450 に答える
1

私が見る2つのエラー:

あなたの正規表現はおそらく間違っています。FASTA入力に実際にキャリッジリターン( )が含まれている可能性は低い\rため、正規表現は何にも一致しません。したがって、if match:テストは常にfalseであるため、何も起こりません。

さらに、各一致を処理する場合:(gene空白である)の最初の文字をキーとして追加し、2番目の文字を値として追加します。

おそらく、それぞれグループ2と4を使用するつもりでした。

myDict[match.group(2)] = match.group(4)
于 2012-09-26T22:41:51.923 に答える
1

このために正規表現を使用しないでください...

class FASTA(object):
    def __init__(self,data):
        self.data = data.strip().splitlines()
        self.desc = self.data[0]
        self.sequence = "".join(self.data[1:]).replace(" ","")#get rid of spaces
    def  GetCodons(self):
        return [self.sequence[i:i+3] for i in range(0,len(self.sequence),3)]
    def __str__(self):
        return "DESC:'%s'\nSEQ:'%s'"%(self.desc,self.sequence)

with open("data.fasta") as f:
      data = f.read()
parts = data.split(">")
for p in parts[1:]:
    f= FASTA(p)
    print f
    print f.GetCodons()
于 2012-09-26T23:12:30.473 に答える
0

ファイルが大きすぎてメモリに収まらない場合を除いて(おそらくそうではないと思います)、全体は次のように単純です。

with open('d.fasta') as fp:
    myDict = dict(re.findall(r'(?m)^>(\w+)\s+^(\S+)', fp.read()))
于 2012-09-26T23:07:43.433 に答える