【问题标题】:Split in python and strip whitespace在 python 中拆分并去除空格
【发布时间】:2016-11-13 06:04:52
【问题描述】:

我正在学习 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)

打印(字段)

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

print(subFields) 产生错误

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

这就是我所做的,只是为了尝试去除空格和制表符,然后在 | 上进行拆分。但它似乎没有做任何事情。最终我想要的这个单个字符串的输出将是

c0_g1_i1 m.1 Q9HGP0.1 100.0

【问题讨论】:

  • .strip() 是多余的,.split() 为您删除。

标签: python split


【解决方案1】:

你现在有一个单独的字符串列表。看起来好像输入格式编码了 nested 列表;外部格式由空格分隔,内部由| 字符分隔。

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

[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')

【讨论】:

  • 非常感谢!你在这里解释得很好:) 这个解决方案在单行上工作,但是当我尝试循环输入文件时,我仍然在将循环应用到每一行而不是第一行时遇到一些问题。 blast_output = open("blast.txt").read() for line in blast_output: fields = blast_output.split() subFields = [item.split('|') for item in blast_output.split()] print(str(subFields)) 它只是一遍又一遍地打印同一行
  • @JamieLeigh:您将目标变量命名为line,但随后拆分blast_output。你根本不需要保留fields = blast_output.split() 行,你不用它。 subFields = item.split('|') for item in line.split()] 应该够了。
  • 哦,谢谢!我现在遇到的问题是将整个文档转换为一行,并为每一行打印一次,但我想单独遍历每一行,我不知道这是否有意义。但是我的for line in blast_output: 循环是否有问题,我可以更改它以便拆分每一行,并让我单独打印每一行的信息?
  • 等等,blast_output 不是文件,而是字符串。你想在这里使用for line in <open file object>:
  • 我不确定要进行哪些更改,我认为导入文件会起作用。我用我遇到的问题更新了原始问题
猜你喜欢
  • 2011-05-03
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 2017-11-03
相关资源
最近更新 更多