1

次のようなテキスト ファイルがあるとします。

[001]This is line 1.
[002][too long]This is line 2 but it's Tooooo
oooo long!
[003]This is line 3.

このファイルを次のように読み取るために、「fileA の for 行」を記述します。

for line in fileA:
    ...

line.find("[too long]")>=0 の場合、現在の行と次の行をマージする必要があります。どうすればいいですか?

PS: 私は書きました:

for line in fileA:
    if line.find("[too long]")>=0:
        loc = fileA.tell()
        fileB = open("file.txt") #open this file again
        fileB.seek(loc)
        line += fileB.readline().strip()

しかし、うまくいきませんでした。なぜ?

4

3 に答える 3

3

ファイルを余分に読み取るため、オーバーヘッドが大きすぎるように思えます。これを試して:

with open('file.txt') as f:
    for line in f:
        if '[too long]' in line:
            line = line.rstrip('\r\n') + next(f)
        print line

版画

[001]This is line 1.

[002][too long]This is line 2 but it's Tooooooooo long!

[003]This is line 3.

[too long]行に が見つかった場合、次の行が追加されます。行が次のようなもので始まるまで、すべての行を追加したいかもしれません[xxx]

于 2013-01-02T12:10:23.747 に答える
2

リスト内包表記を使用して、すべての行をリストに取得し、eumiros answer と非常によく似た処理を行うことができます。

with open('file.txt') as f:
    lines = [line.rstrip('\r\n') + next(f) if '[too long]' in line else line for line in f]

出力は次のとおりです。

>>> lines
    ['[001]This is line 1.\n', "[002][too long]This is line 2 but it's Tooooooooo long!\n", '[003]This is line 3.\n']
于 2013-01-02T12:26:41.947 に答える
0

実際のファイルがどのように見えるかはわかりませんが、おそらく次のようになります

contents = """[001]This is line 1.
[002][too long]This is line 2 but it's Tooooo
oooo long!
[003]This is line 3.
"""

lines = iter( contents.split("\n") )

def fix_file( lines ):
    prev = ''
    number = 1
    for line in lines:
        if not line.startswith( '[{0:03d}]'.format( number ) ):
            prev += line
        else:
            yield prev
            number = number + 1
            prev = line
    yield prev

for line in fix_file( lines ):
    print line

この方法では、行に余分なコンテンツは必要ありません。

于 2013-01-02T12:22:40.140 に答える