2017-03-23 31 views
0

私はGFFファイルは次のようになります:gffileの名前IDの名前を変更しています。

contig1 loci gene 452050 453069 15 - . ID=dd_g4_1G94; 
contig1 loci mRNA 452050 453069 14 - . ID=dd_g4_1G94.1;Parent=dd_g4_1G94 
contig1 loci exon 452050 452543 . - . ID=dd_g4_1G94.1.exon1;Parent=dd_g4_1G94.1 
contig1 loci exon 452592 453069 . - . ID=dd_g4_1G94.1.exon2;Parent=dd_g4_1G94.1 
contig1 loci mRNA 452153 453069 15 - . ID=dd_g4_1G94.2;Parent=dd_g4_1G94 
contig1 loci exon 452153 452543 . - . ID=dd_g4_1G94.2.exon1;Parent=dd_g4_1G94.2 
contig1 loci exon 452592 452691 . - . ID=dd_g4_1G94.2.exon2;Parent=dd_g4_1G94.2 
contig1 loci exon 452729 453069 . - . ID=dd_g4_1G94.2.exon3;Parent=dd_g4_1G94.2 
### 

私は上記の遺伝子のためのエントリがあるように、0001から始まる、ID名の名前を変更したい:

contig1 loci gene 452050 453069 15 - . ID=dd_0001; 
contig1 loci mRNA 452050 453069 14 - . ID=dd_0001.1;Parent=dd_0001 
contig1 loci exon 452050 452543 . - . ID=dd_0001.1.exon1;Parent=dd_0001.1 
contig1 loci exon 452592 453069 . - . ID=dd_0001.1.exon2;Parent=dd_0001.1 
contig1 loci mRNA 452153 453069 15 - . ID=dd_0001.2;Parent=dd_g4_1G94 
contig1 loci exon 452153 452543 . - . ID=dd_0001.2.exon1;Parent=dd_0001.2 
contig1 loci exon 452592 452691 . - . ID=dd_0001.2.exon2;Parent=dd_0001.2 
contig1 loci exon 452729 453069 . - . ID=dd_0001.2.exon3;Parent=dd_0001.2 

上記の例単純に1つの遺伝子の入力ですが、ID = dd_0001から順に、すべての遺伝子とそれに対応するmRNA /エクソンの名前を変更したいと考えています。 これを行う方法に関するヒントは非常に高く評価されます。

+0

質問をする前に、[よくある質問ですか?](http://stackoverflow.com/help/how-to-ask)をお読みください。 –

答えて

1

ファイルを開く必要があり、次にidが1行ずつ置き換えられます。
file I/Ostr.replace()のドキュメント参照は次のとおりです。

gff_filename = 'filename.gff' 
replace_string = 'dd_g4_1G94' 
replace_with = 'dd_0001' 

lines = [] 
with open(gff_filename, 'r') as gff_file: 
    for line in gff_file: 
     line = line.replace(replace_string, replace_with) 
     lines.append(line) 

with open(gff_filename, 'w') as gff_file: 
    gff_file.writelines(lines) 

Windows 10、Python 3.5.1でテストされています。

idsを検索するには、regexを使用してください。

import re 

gff_filename = 'filename.gff' 
replace_with = 'dd_{}' 
re_pattern = r'ID=(.*?)[;\.]' 

ids = [] 
lines = [] 
with open(gff_filename, 'r') as gff_file: 
    file_lines = [line for line in gff_file] 

for line in file_lines: 
    matches = re.findall(re_pattern, line) 
    for found_id in matches: 
     if found_id not in ids: 
      ids.append(found_id) 

for line in file_lines: 
    for ID in ids: 
     if ID in line: 
      id_suffix = str(ids.index(ID)).zfill(4) 
      line = line.replace(ID, replace_with.format(id_suffix)) 
    lines.append(line) 

with open(gff_filename, 'w') as gff_file: 
    gff_file.writelines(lines) 

これは他の方法もありますが、これは非常に堅牢です。

+0

これは非常に便利です、ありがとうございます。唯一の問題は、私が何千ものIDを置き換えることです。新しい置換えされていないIDが見つかるたびに、0000から始まる連続したIDに置き換えられると、Pythonには何か方法がありますか? –

+0

チェックマークをクリックして回答を受け入れることができます。 – Lupilum

+0

どうもありがとうございます。何千ものIDのためにこのプロセスを自動化し、dd_0001から新しいものに置き換える方法についてのヒントが必要です。 –

関連する問題