2016-12-10 6 views
-1

私はこの小さな例のようなファイルを持っている:テキストファイルに変なファイルを解析する

小さな例:

>ENSG00000003249|ENST00000002501|DBNDD1|2079 
GCCGCGGCCCCCCGGTTGCTGCCCCGATGCGCTGCGCCCGGAGCCGGGGCCGAGTCGCTG 
CCGCAGCTGTTGGGGCGCCCGGGCCAGGCGACGCCGCCGTCGCCCGTGCCCCTCCCAGAC 
CGCACCGGCCGC 
>ENSG00000048028|ENST00000003302|USP28|4669 
AGTCCTGAGAGGCTGGGCCGGCGGCGGCTGCGGCGGGAGACCGGTGACCCGCGGCTGGGC 
GCCTCGGCC 

">"で開始された最初の行は"|"とで区切られた4部を持っています次の行は、">"で始まる行に関連する一連の文字です。 このファイルを5列のテキストファイルに解析します。最初の4列は">"で始まる最初の行にあり、5行目はシーケンスです。例えば が、結果は次のようになり、最後のシーケンスFOE:

ENSG00000048028 ENST00000003302 USP28 4669 AGTCCTGAGAGGCTGGGCCGGCGGCGGCTGCGGCGGGAGACCGGTGACCCGCGGCTGGGCGCCTCGGCC 

を私はこのコードをしたが、うまくいきませんでした:

list = [] 
with open(inputfile) as f: 
    for line in f: 
     if line.startswith('>'): 
      parts = line.split('|') 
     else: 
      parts = sequence 
     list.append(parts) 

infile = open('test.txt', 'w') 
for item in list: 
    infile.write("%s\n" % item) 
+2

これは、[FASTAファイル形式](http://bioperl.org/formats/ですsequence_formats/FASTA_sequence_format)、DNA情報を含んでいます。 ['BioPy.SeqIO()'](http://biopython.org/wiki/SeqIO)を使うか、手動で解析することができます。 –

+0

なぜ私はテキスト形式を別のものに変換したいのか不思議です。このデータをあなたが書いていない別のプログラムに供給しようとしていますか? – qxz

+0

上記のテキストを空白で区切られた2行の部分文字列に再フォーマットしますか? – RomanPerekhrest

答えて

1

これはFASTA file formatです。これを手動で解析する場合は、後で使用できるようにヘッダ行を格納します。シーケンスは複数の行にまたがる可能性があることに注意してください。末尾に達したときにのみ、または新しいヘッダーに到達したときに結合された列を書き出します。

私はあなたの出力を書き込むためにcsvモジュールを使用したい:

import csv 

with open(inputfile) as f, open('test.txt', 'w') as outfile: 
    header = sequence = None 
    out = csv.writer(outfile, delimiter='|') 
    for line in f: 
     if line.startswith('>'): # header 
      # write out previous data 
      if header: 
       entry = header + [''.join(sequence)] 
       out.writerow(entry) 
      header = line.strip('>\n').split('|') 
      sequence = [] 
     else: 
      sequence.append(line.strip()) 

    if header: 
     entry = header + [''.join(sequence)] 
     out.writerow(entry) 

はデモ:

>>> from io import StringIO 
>>> import csv 
>>> demoinput = StringIO('''\ 
... >ENSG00000003249|ENST00000002501|DBNDD1|2079 
... GCCGCGGCCCCCCGGTTGCTGCCCCGATGCGCTGCGCCCGGAGCCGGGGCCGAGTCGCTG 
... CCGCAGCTGTTGGGGCGCCCGGGCCAGGCGACGCCGCCGTCGCCCGTGCCCCTCCCAGAC 
... CGCACCGGCCGC 
... >ENSG00000048028|ENST00000003302|USP28|4669 
... AGTCCTGAGAGGCTGGGCCGGCGGCGGCTGCGGCGGGAGACCGGTGACCCGCGGCTGGGC 
... GCCTCGGCC 
... ''') 
>>> outfile = StringIO() 
>>> f = demoinput 
>>> header = sequence = None 
>>> out = csv.writer(outfile, delimiter='|') 
>>> for line in f: 
...  if line.startswith('>'): # header 
...   # write out previous data 
...   if header: 
...    entry = header + [''.join(sequence)] 
...    out.writerow(entry) 
...   header = line.strip('>\n').split('|') 
...   sequence = [] 
...  else: 
...   sequence.append(line.strip()) 
... 
178 
>>> if header: 
...  entry = header + [''.join(sequence)] 
...  out.writerow(entry) 
... 
114 
>>> print(outfile.getvalue()) 
ENSG00000003249|ENST00000002501|DBNDD1|2079|GCCGCGGCCCCCCGGTTGCTGCCCCGATGCGCTGCGCCCGGAGCCGGGGCCGAGTCGCTGCCGCAGCTGTTGGGGCGCCCGGGCCAGGCGACGCCGCCGTCGCCCGTGCCCCTCCCAGACCGCACCGGCCGC 
ENSG00000048028|ENST00000003302|USP28|4669|AGTCCTGAGAGGCTGGGCCGGCGGCGGCTGCGGCGGGAGACCGGTGACCCGCGGCTGGGCGCCTCGGCC 
+0

あなたがそれかどうか試してみましたが、出力は次のようであるならば、私は知らない:ENSG00000003249 | ENST00000002501 | DBNDD1 | 2079年| "GCCGCGGCCCCCCGGTTGCTGCCCCGATGCGCTGCGCCCGGAGCCGGGGCCGAGTCGCTG "|" CCGCAGCTGTTGGGGCGCCCGGGCCAGGCGACGCCGCCGTCGCCCGTGCCCCTCCCAGAC "|" CCGCAGCTGTTGGGGCGCCCGGGCCAGGCGACGCCGCCGTCGCCCGTGCCCCTCCCAGAC CGCACCGGCCGC " – bzmby

+0

@bzmby:私は思いますシーケンスを取り除く必要がある、私はそこに改行があると思う。私は今それを追加しました。 –

+0

それは素晴らしいです。それでも私は1つの列しか持っていません。分離は「|」である。私は5つの列を持っています – bzmby

関連する問題