【问题标题】:Preserve whitespaces when using split() and join() in python在 python 中使用 split() 和 join() 时保留空格
【发布时间】:2013-03-22 20:25:18
【问题描述】:

我有一个包含如下列的数据文件

BBP1   0.000000  -0.150000    2.033000  0.00 -0.150   1.77

并且各个列由不同数量的空格分隔。

我的目标是读入这些行,对几行进行一些数学运算,例如将第 4 列乘以 .95,然后将它们写到一个新文件中。新文件应该看起来像原来的文件,除了我修改的值。

我的方法是将行作为列表项读取。然后我会在我感兴趣的那些行上使用split(),这将为我提供一个包含各个列值的子列表。然后我进行修改,join() 列在一起并将列表中的行写入一个新的文本文件。

问题是我有不同数量的空格。我不知道如何以我阅读它们的相同方式将它们介绍回来。我能想到的唯一方法是在拆分它们之前计算行中的字符,这将非常乏味。有人有更好的主意来解决这个问题吗?

【问题讨论】:

  • 如果文件是固定格式,那么使用相同数量的空格可以改变列宽。您可以使用字符串格式来保留文件格式,例如"{:4s} {:10.6f} {:10.6f} {:11.6f} {:5.2f} {:6.3f} {:6.2f}".format(*row),其中row = ["BBP1", 0.0, -0.15, 0.95*2.033, 0.0, -0.15, 1.77]

标签: python join split


【解决方案1】:

在这种情况下,您想将re.split() 与一个组一起使用:

re.split(r'(\s+)', line)

将返回列空白,以便您稍后可以重新加入包含相同数量空白的行。

例子:

>>> re.split(r'(\s+)', line)
['BBP1', '   ', '0.000000', '  ', '-0.150000', '    ', '2.033000', '  ', '0.00', ' ', '-0.150', '   ', '1.77']

您可能确实想从末尾删除换行符。

【讨论】:

  • 为了始终如一地处理开头和/或结尾的空白,更好的模式是(\S+)
  • @MikeT:不利的一面是,如果开头或结尾没有空格,您会得到一个空的'' 字符串。
  • 拆分 (\S+) 总是在开头和结尾处有非单词字符串,从我的角度来看,这是可以预见的好处。
【解决方案2】:

对于在开头和/或结尾有空格的行,更强大的模式是 (\S+) 在非空格字符处拆分:

import re

line1 = ' 4   426.2   orange\n'
line2 = '12    82.1   apple\n'

re_S = re.compile(r'(\S+)')
items1 = re_S.split(line1)
items2 = re_S.split(line2)
print(items1)  # [' ', '4', '   ', '426.2', '   ', 'orange', '\n']
print(items2)  # ['', '12', '    ', '82.1', '   ', 'apple', '\n']

这两行拆分后的item数相同,很方便。第一项和最后一项是 always 空白字符串。可以使用零长度字符串的连接来重构这些行:

print(repr(''.join(items1)))  # ' 4   426.2   orange\n'
print(repr(''.join(items2)))  # '12    82.1   apple\n'

为了将示例与此处另一个答案中使用的类似模式(\s+)(小写)进行对比,每行拆分为不同的结果长度和项目的位置:

re_s = re.compile(r'(\s+)')
print(re_s.split(line1))  # ['', ' ', '4', '    ', '20.0', '   ', 'orange', '\n', '']
print(re_s.split(line2))  # ['12', '    ', '82.1', '   ', 'apple', '\n', '']

如您所见,以一致的方式处理这会有点困难。

【讨论】:

    【解决方案3】:

    其他方法是:

    s = 'BBP1   0.000000  -0.150000    2.033000  0.00 -0.150   1.77'
    s.split(' ')
    >>> ['BBP1', '', '', '0.000000', '', '-0.150000', '', '', '', '2.033000', '', '0.00', '-0.150', '', '', '1.77']
    

    如果我们在 split 函数中指定空格字符参数,它会创建列表而不吃连续的空格字符。因此,在 'join' 函数之后,空格字符的原始数量会被恢复。

    【讨论】:

    • 嗯,这太棒了。不知道通过 space 字符明确给出了所需的结果。谢谢@Gaurav
    • 问题是它将空格作为空字符串解析到列表''而不是' '
    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多