2016-11-12 82 views
0

我在學習Python,目前正在讀取文件,分割線條,然後打印特定元素。儘管我有多次分裂的麻煩。我工作的文件有很多行看起來像這樣在python和strip中分割空白

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

我試圖拆呢,首先由製表符和換行符「/ T/N」,然後分裂與元素|,我曾嘗試.split和.strip,並沒有太多的運氣。我想也許如果我只是在一行上工作,我能得到的想法下來,然後修改成將訪問文件

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

你現在有一個單獨的字符串的列表。它看起來好像輸入格式編碼嵌套列表;外部格式由空格分隔,內部由|個字符組成。

可以拆分外字符串,則在列表理解再次分裂各所得元件:

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

注意,str.strip()是完全冗餘的,則str.split()調用(不帶參數或None作爲第一個參數)已經刪除了前導空白和尾隨空白。

如果你希望一個平面列表,你會增加另一個循環來理解:

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

前者將是可取的,如果在內部列表中的項目數是可變的;找到嵌套列表的第一個或最後一個元素要比找出每個以空格分隔的節開始或結束的平面列表更容易。

你對於自己定的例子則可以用以下兩種表現形式之一提取,這取決於最終值變體,你選擇的是:

(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

非常感謝!你在這裏做了一個很好的解釋:)這個解決方案在單線上工作,但是當我嘗試循環輸入文件時,我仍然在將循環應用到每行而不是僅第一行時出現了一些問題。 blast_output = open(「blast.txt」)。read() for blast_output中的行: fields = blast_output.split() subFields = [item.split('|')爲blast_output中的項目。split()] print(str(subFields))'它只是一遍又一遍地打印同一條線 –

+0

@JamieLeigh:你將目標變量命名爲'line',然後拆分'blast_output'。你根本不需要保留'fields = blast_output.split()'行,你不用它。 'line.split()]中item的subFields = item.split('|')應該足夠了。 –

+0

哦,謝謝!我現在遇到的問題是它將整個文檔轉換爲一行,併爲每行打印一次,但我想單獨遍歷每一行,我不知道這是否有意義。但是我的''在blast_output:'循環中是否有問題,我可以改變它,這樣它會分割每一行,並讓我單獨打印每行的信息? –