在python中拆分并去除空白

在python中拆分并去除空白,python,split,Python,Split,我正在学习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 我正在尝试拆分它,首先是通过制表符和换行符“/t/n”,然后用|拆分元素,我已经尝试了.spl

我正在学习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
我正在尝试拆分它,首先是通过制表符和换行符“/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)
打印(字段)

打印(子字段)生成错误

subFields = fields.split('|')
AttributeError: 'list' object has no attribute 'split'
这就是我所做的,只是试图去掉空白和标签,然后继续分割,但它似乎没有任何作用。最终,我希望从这个字符串得到的输出是

c0_g1_i1 m.1 Q9HGP0.1 100.0

您现在有一个单独字符串的列表。看起来输入格式对嵌套列表进行了编码;外部格式由空格分隔,内部格式由
字符分隔

您可以拆分外部字符串,然后在列表中再次拆分每个结果元素:

[item.split('|') for item in blast_out.split()]
[value for item in blast_out.split() for value in item.split('|')]
请注意,
str.strip()
是完全冗余的,
str.split()
调用(没有参数或
None
作为第一个参数)已经删除了前导和尾随空格

如果您希望得到一个简单的列表,您应该在理解中添加另一个循环:

[item.split('|') for item in blast_out.split()]
[value for item in blast_out.split() for value in item.split('|')]
如果内部列表中的项目数量可变,则前者更可取;查找嵌套列表的第一个或最后一个元素比在平面列表中找出每个以空格分隔的部分的开始或结束位置更容易

然后,可以使用以下两个表达式之一提取给定示例的最终值,具体取决于您选择的变量:

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

演示:


您现在有一个单独字符串的列表。看起来输入格式对嵌套列表进行了编码;外部格式由空格分隔,内部格式由
字符分隔

您可以拆分外部字符串,然后在列表中再次拆分每个结果元素:

[item.split('|') for item in blast_out.split()]
[value for item in blast_out.split() for value in item.split('|')]
请注意,
str.strip()
是完全冗余的,
str.split()
调用(没有参数或
None
作为第一个参数)已经删除了前导和尾随空格

如果您希望得到一个简单的列表,您应该在理解中添加另一个循环:

[item.split('|') for item in blast_out.split()]
[value for item in blast_out.split() for value in item.split('|')]
如果内部列表中的项目数量可变,则前者更可取;查找嵌套列表的第一个或最后一个元素比在平面列表中找出每个以空格分隔的部分的开始或结束位置更容易

然后,可以使用以下两个表达式之一提取给定示例的最终值,具体取决于您选择的变量:

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

演示:


.strip()
是多余的,
.split()
为您剥离。
.strip()
是多余的,
.split()
为您剥离。非常感谢!你在这里解释得很好:)这个解决方案在单行上工作,但是当我尝试循环输入文件时,我仍然遇到一些问题,无法将循环应用到每一行,而不仅仅是第一行<代码>blast_output=open(“blast.txt”).read()用于blast_输出中的行:fields=blast_output.split()子字段=[item.split(“|”)用于blast_输出中的项。split()]打印(str(子字段))它只是反复打印同一行again@JamieLeigh:您将目标变量命名为
line
,但随后拆分
blast\u输出
。您根本不需要保留
fields=blast\u output.split()
行,您不需要使用它
subFields=item.split(“|”)对于第行中的item.split()]
应该足够了。哦,谢谢!我现在遇到的问题是,它将整个文档转换为一行,每行打印一次,但我想逐一遍历每行,我不知道这是否有意义。但是我的blast_输出中的
行是否有问题:
循环,我可以更改它,使其拆分每一行,并让我分别打印每一行的信息?等等,
blast_输出
不是一个文件,那是一个字符串。您想在此处使用
作为输入行:
。我不确定要做哪些更改,我认为在中导入文件会起作用。我用我遇到的问题更新了原始问题非常感谢!你在这里解释得很好:)这个解决方案在单行上工作,但是当我尝试循环输入文件时,我仍然遇到一些问题,无法将循环应用到每一行,而不仅仅是第一行<代码>blast_output=open(“blast.txt”).read()用于blast_输出中的行:fields=blast_output.split()子字段=[item.split(“|”)用于blast_输出中的项。split()]打印(str(子字段))它只是反复打印同一行again@JamieLeigh:您将目标变量命名为
line
,但随后拆分
blast\u输出
。您根本不需要保留
fields=blast\u output.split()
行,您不需要使用它
subFields=item.split(“|”)对于第行中的item.split()]
应该足够了。哦,谢谢!我现在遇到的问题是,它将整个文档转换为一行,每行打印一次,但我想逐一遍历每行,我不知道这是否有意义。但是我的blast_输出中的
行是否有问题:
循环,我可以更改它,使其拆分每一行,并让我分别打印每一行的信息?等等,
blast_输出
不是一个文件,那是一个字符串。您想在此处使用
作为输入行:
。我不确定要做哪些更改,我认为在中导入文件会起作用。我用我遇到的问题更新了原始问题