32

我有一个数据文件,其中包含如下列

BBP1   0.000000  -0.150000    2.033000  0.00 -0.150   1.77

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

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

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

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

4

3 回答 3

43

在这种情况下,您想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']

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

于 2013-03-22T20:26:52.520 回答
8

其他方法是:

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 函数中指定空格字符参数,它会创建列表而不吃连续的空格字符。因此,在“加入”功能后,原始空格字符数会被恢复。

于 2017-07-08T06:48:24.903 回答
4

对于在开头和/或结尾有空格的行,更健壮的模式是(\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']

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

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', '']

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

于 2018-11-20T01:59:27.887 回答