2016-11-12 10 views
0

私はPythonを学んでいますが、現在はファイルを読み込み、行を分割して特定の要素を印刷しています。私は何度も分割するのに困っている。私が働いているファイルは「/ T/N」最初のタブと改行で、私はそれを分割しようとしています。このPythonで分割し空白を取り除く

c0_g1_i1|m.1 gi|74665200|sp|Q9HGP0.1|PVG4_SCHPO  100.00 372  0  0  1  372  1  372  0.0  754 

のように見える多くの行があり、その後で要素を分割|、私が試してみました.splitと.stripと運がたくさんありません。私は1行だけに働いていた場合、私は私がダウンしてアイデアを取得し、その後、(ファイル

blast_out = ("c0_g1_i1|m.1 gi|74665200|sp|Q9HGP0.1|PVG4_SCHPO  100.00 372  0  0  1  372  1  372  0.0  754") 
fields = blast_out.strip(' \t\r\n').split() 
subFields = fields.split("|") 
print(fields) 
print(subFields) 

プリント(フィールド)

['c0_g1_i1|m.1', 'gi|74665200|sp|Q9HGP0.1|PVG4_SCHPO', '100.00', '372', '0', '0', '1', '372', '1', '372', '0.0', '754'] 

プリントにアクセスするループにそれを修正することができるかもしれない考え出し|サブフィールド)これは私がちょうどに分割する、その後、空白やタブを削除しようとする何をしたかであるエラー

subFields = fields.split('|') 
AttributeError: 'list' object has no attribute 'split' 

を生成し、それは何もしていないようです。最終的にこの単一の文字列からの私の望ましい出力は

c0_g1_i1 m.1 Q9HGP0.1 100.0 
+0

'.strip()'は冗長で、 '.split()'はあなたのために削除されます。 –

答えて

2

となりました。入力フォーマットがのネストされたリストをエンコードしているかのように見えます。外側の書式は空白で区切られ、内側は|文字で区切られます。

あなたは、リスト内包で再び得られた各要素を分割し、外側の文字列を分割することができる:str.strip()は完全に冗長であること

[item.split('|') for item in blast_out.split()] 

注、str.split()コール(引数またはNoneなしで最初の引数として)はすでに先頭と末尾の空白を削除します。あなたがフラットなリストを期待した場合

、あなたが理解する別のループを追加したい:

[value for item in blast_out.split() for value in item.split('|')] 

内側のリスト内の項目数が可変である場合が好ましいであろう元。それぞれの空白で区切られたセクションが開始または終了するフラットなリストで把握するよりも、ネストされたリストの最初または最後の要素を見つける方が簡単です。そして、これに応じて、2次式のいずれかを用いて抽出することができ、あなたの与え例えば

あなたの最終的な値は、あなたが選んだバリアント:

(result[0][0], result[0][1], result[1][3], result[2][0]) 

または

(result[0], result[1], result[5], result[7]) 

デモ:

>>> blast_out = "c0_g1_i1|m.1 gi|74665200|sp|Q9HGP0.1|PVG4_SCHPO  100.00 372  0  0  1  372  1  372  0.0  754" 
>>> [item.split('|') for item in blast_out.split()] 
[['c0_g1_i1', 'm.1'], ['gi', '74665200', 'sp', 'Q9HGP0.1', 'PVG4_SCHPO'], ['100.00'], ['372'], ['0'], ['0'], ['1'], ['372'], ['1'], ['372'], ['0.0'], ['754']] 
>>> (_[0][0], _[0][1], _[1][3], _[2][0]) 
('c0_g1_i1', 'm.1', 'Q9HGP0.1', '100.00') 
>>> [value for item in blast_out.split() for value in item.split('|')] 
['c0_g1_i1', 'm.1', 'gi', '74665200', 'sp', 'Q9HGP0.1', 'PVG4_SCHPO', '100.00', '372', '0', '0', '1', '372', '1', '372', '0.0', '754'] 
>>> (_[0], _[1], _[5], _[7]) 
('c0_g1_i1', 'm.1', 'Q9HGP0.1', '100.00') 
+0

ありがとうございました!あなたはそれをここで説明する素晴らしい仕事をしています:)この解決策は1行で動作しますが、入力ファイルをループしようとすると、最初の行ではなく各行にループを適用する際にいくつか問題があります。 blast_outputの行のread() : fields = blast_output.split() blast_outputの項目のsubFields = [item.split( '|')]を選択すると、blast_output = open( "blast.txt" print(str(subFields)) '同じ行を何度も繰り返し印刷するだけです。 –

+0

@JamieLeigh:ターゲット変数に' line'という名前を付けましたが、blast_outputを分割しました。あなたは 'fields = blast_output.split()'行をまったく保持する必要はありません。あなたはそれを使用しません。 'subFields = item.split( '|')for line.split()]'で十分です。 –

+0

ああ、ありがとう!私が今問題にしているのは、文書全体を1行に変換して各行に1回印刷することですが、各行を個別に繰り返したいのですが、それが意味をなさないかどうかはわかりません。しかし、blast_output: 'for line in blast_output: 'ループに何か問題があります。これを変更して各行を分割し、各行から個別に情報を出力させてもらうことができますか? –

関連する問題