2016-11-12 81 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:'循环中是否有问题,我可以改变它,这样它会分割每一行,并让我单独打印每行的信息? –