2017-09-30 19 views
1

私は特定の遺伝子を抽出したい遺伝子バンクファイル.gbkを持っています。私の問題は次のとおりです。 ファイルを処理するには、各軌跡のヘッダーが特定の形式でなければならず、ファイル内にはありません。私は、ファイルを解析し、次のようにヘッダを置き換えたい:ファイルを解析してPythonの文字列を修正してください

LOCUS  NODE_1_length_393688_cov_17.8554393688 bp DNA linear 
BCT22-MAY-2017 
DEFINITION Escherichia coli strain strain. 
ACCESSION 
VERSION 
KEYWORDS . 
SOURCE  Escherichia coli 
    ORGANISM Escherichia coli 
      Bacteria; Proteobacteria; gamma subdivision; Enterobacteriaceae; 
      Escherichia. 
.... 
>>Gene data here 
.... 

LOCUS  NODE_2_length_278889_cov_17.85545278889 bp DNA linear 
BCT22-MAY-2017 
DEFINITION Escherichia coli strain strain. 
ACCESSION 
VERSION 
KEYWORDS . 
SOURCE  Escherichia coli 
    ORGANISM Escherichia coli 
      Bacteria; Proteobacteria; gamma subdivision; Enterobacteriaceae; 
      Escherichia. 
.... 
>>Gene data here 
.... 

LOCUS  NODE_3_length_340008_cov_17.855432340008 bp DNA linear 
BCT22-MAY-2017 
DEFINITION Escherichia coli strain strain. 
ACCESSION 
VERSION 
KEYWORDS . 
SOURCE  Escherichia coli 
    ORGANISM Escherichia coli 
      Bacteria; Proteobacteria; gamma subdivision; Enterobacteriaceae; 
      Escherichia. 
.... 
>>Gene data here 
.... 

NODEで始まる文字列はファイル形式の大会のために長すぎると、それはそのように見えるように交換する必要があります

LOCUS  NODE_1_393688 bp DNA linear 
.... 
LOCUS  NODE_2_278889 bp DNA linear 
.... 
LOCUS  NODE_3_340008 bp DNA linear 

切り取る必要がある部分は同じ長さである必要はないので、文字列の特定の位置の間のすべてを削除するという固定アプローチは実現できません。私はre.compile()とr.sub()を使っていろいろなアプローチを試みましたが、それまで成功していませんでした。

ご協力いただければ幸いです。 ありがとうございました!

答えて

1

あなたが最初の行を読んだとき、あなたはフィールドを読むことができると、次のように、「ノード」フィールドを正規化:

import operator 

def normalize_name(name): 
    parts = name.split("_") 
    return "_".join(operator.itemgetter(0, 1, 3)(parts)) 

それは部分にフィールド名を分割します。あなたはリストを手に入れる。あなたが得る

for name in [ 
    "NODE_1_length_393688_cov_17.8554393688", 
    "NODE_2_length_278889_cov_17.85545278889", 
    "NODE_3_length_340008_cov_17.855432340008" 
    ]: 
    print(normalize_name(name)) 

NODE_1_393688 
NODE_2_278889 
NODE_3_340008 
はその後、 部品に適用 operator.itemgetter(0, 1, 3)機能は、例えば2

をスキップして、インデックス0、1と3の項目を抽出します

デモ

+0

これはいい音ですが、私はこれをループ内に実装して、異なるサブディレクトリにある複数のファイルを解析し、各ファイルの 'LOCUS'で始まる行のすべてのインスタンスを修正するだけです。これを行うためには、ファイル全体で読み込まれた 'content = textwrap.dedent'関数にテキストを埋め込む必要があります。 'textwrap.dedent'できますか? – kruemelprinz

関連する問題