2016-11-12 6 views
0

私は非常にPythonに新しく、いくつかの問題を抱えています。答えが見つからないようです。 私は大きなファイルを読み込み、次に特定の情報を分割して書き出しようとしています。私は読み込みと分割に問題があり、同じことを何度も何度も何度も印刷しているだけです。ファイルを読み込み、分割してから希望の出力を書き出します。

blast_output = open("blast.txt").read() 
for line in blast_output: 
    subFields = [item.split('|') for item in blast_output.split()] 
    print(str(subFields[0][0]) + "\t" + str(subFields[0][1]) + "\t" + str(subFields[1][3]) + "\t" + str(subFields[2][0])) 

私の入力ファイルは次のようになり、多くの行があります:私は受け付けており、出力はこれです

c0_g1_i1|m.1 gi|74665200|sp|Q9HGP0.1|PVG4_SCHPO  100.00 372  0  0  1  372  1  372  0.0  754 
c1002_g1_i1|m.801  gi|1723464|sp|Q10302.1|YD49_SCHPO  100.00 646  0  0  1  646  1  646  0.0  1310 
c1003_g1_i1|m.803  gi|74631197|sp|Q6BDR8.1|NSE4_SCHPO  100.00 246  0  0  1  246  1  246  1e-179 502 
c1004_g1_i1|m.804  gi|74676184|sp|O94325.1|PEX5_SCHPO  100.00 598  0  0  1  598  1  598  0.0  1227 

を:

c0_g1_i1 m.1 Q9HGP0.1 100.00 
c0_g1_i1 m.1 Q9HGP0.1 100.00 
c0_g1_i1 m.1 Q9HGP0.1 100.00 
c0_g1_i1 m.1 Q9HGP0.1 100.00 

しかし、私は望んでいますと、

c0_g1_i1  m.1 Q9HGP0.1 100.0 
c1002_g1_i1 m.801 Q10302.1 100.0 
c1003_g1_i1 m.803 Q6BDR8.1 100.0 
c1004_g1_i1 m.804 O94325.1 100.0 
です
+1

あなたは3行目にline.split()を使用する必要があります。 – giliev

+0

'blast_output'は文字列です。文字列を反復処理すると、行ではなく文字になります。最初に '.read()'を削除して、ファイルの行を繰り返し処理します。 –

+0

あなたのリストの理解を広げ、すべてのフィールドを変数に割り当ててみてください*。次に、個々の変数(おそらくprintステートメントで)を調べて、何が起こっているかを見ることができます。 – wwii

答えて

1

ファイルオブジェクトのreadメソッドを呼び出す必要はなく、1行ずつ繰り返し実行するだけです。そして、すべての反復で同じ動作を繰り返すことを避けるために、forループでlineblast_outputを置き換える:

with open("blast.txt") as blast_output: 
    for line in blast_output: 
     subFields = [item.split('|') for item in line.split()] 
     print("{:15}{:10}{:10}{:10}".format(subFields[0][0], subFields[0][1], 
              subFields[0][1], subFields[1][3], subFields[2][0])) 

私はwithを使用してコンテキストでファイルを開いているので、閉鎖が自動的にPythonが行われます。私は文字列書式を使って最終的な文字列を作成しました。


c0_g1_i1  m.1  m.1  Q9HGP0.1 
c1002_g1_i1 m.801  m.801  Q10302.1 
c1003_g1_i1 m.803  m.803  Q6BDR8.1 
c1004_g1_i1 m.804  m.804  O94325.1 
1

大きな質問です。あなたはこのラインで何度も繰り返し

subFields = [item.split('|') for item in blast_output.split()] 

Pythonの2.xバージョンを同じ入力を取っていることは次のようになります。

blast_output = open("blast.txt").read() 
for line in blast_output: 
    subFields = [item.split('|') for item in line.split()] 
    print(str(subFields[0][0]) + "\t" + str(subFields[0][1]) + "\t" + str(subFields[1][3]) + "\t" + str(subFields[2][0])) 

のPython 3.xのフォーマットされたnice値

ためモーセKoledoyeのバージョンを見ます
+0

ありがとう、これはなぜそれが動作していないか明確にします。私は使用しているテキストがバージョン2を表示していると思いますが、バージョン3が必要です:) –

関連する問題