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関数でスペース文字引数を指定すると、連続するスペース文字を食べずにリストが作成されます。したがって、「join」関数の後に、元の空白文字数が復元されます。

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

これらの2つの行は、分割後のアイテム数が同じであるため、便利です。最初と最後の項目は常に空白文字列です。これらの行は、長さがゼロの文字列を使用した結合を使用して再構成できます。

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 に答える