我有一个包含
等列的数据文件BBP1 0.000000 -0.150000 2.033000 0.00 -0.150 1.77
并且各列以不同数量的空格分隔。
我的目标是读取这些行,对几行进行一些数学运算,例如将第4列乘以.95,然后将它们写入新文件。新文件应该与原始文件类似,但我修改的值除外。
我的方法是将行读作列表项。然后我会在我感兴趣的那些行上使用split()
,这会给我一个包含各个列值的子列表。然后我一起修改join()
列,并将列表中的行写入新的文本文件。
问题是我有不同数量的空白。我不知道如何以我读它们的方式将它们引回来。我能想到的唯一方法是在分割它们之前对行中的字符进行计数,这将非常繁琐。有人有更好的想法来解决这个问题吗?
答案 0 :(得分:25)
在这种情况下,你想使用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']
你可能做想要从最后删除换行符。
答案 1 :(得分:3)
对于在开头和/或结尾处带有空格的行,更健壮的模式是(\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', '']
如您所见,以一致的方式处理起来会更加困难。
答案 2 :(得分:2)
其他方法是:
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函数中指定空格字符参数,它会创建列表而不会吃连续的空格字符。因此,在“加入”功能之后,原始的空格字符数将被恢复。