17

同じ形式で長さが異なる複数のファイルを読み取っているため、特定の行番号については話していません。
次のテキスト ファイルがあるとします。

Something here...  
... ... ...   
Start                      #I want this block of text 
a b c d e f g  
h i j k l m n  
End                        #until this line of the file
something here...  
... ... ...  

私が何を意味するか知っていることを願っています。ファイルを繰り返し処理し、正規表現を使用して検索して「開始」と「終了」の行番号を見つけ、linecache を使用して開始行から終了行まで読み取ることを考えていました。しかし、行番号を取得する方法は?どのような機能を使用できますか?

4

4 に答える 4

37

Startとの間のテキスト ブロックだけが必要な場合は、次のEndように簡単に実行できます。

with open('test.txt') as input_data:
    # Skips text before the beginning of the interesting block:
    for line in input_data:
        if line.strip() == 'Start':  # Or whatever test is needed
            break
    # Reads text until the end of the block:
    for line in input_data:  # This keeps reading the file
        if line.strip() == 'End':
            break
        print line  # Line is extracted (or block_of_lines.append(line), etc.)

実際、開始マーカーと終了マーカーの間のデータを読み取るために行番号を操作する必要はありません。

ロジック (「… まで読む」) は両方のブロックで繰り返されますが、非常に明確で効率的です (他の方法では通常、[ブロックの前/ブロック内/ブロックの最後に到達する] の状態をチェックする必要があり、時間のペナルティが発生します)。

于 2011-09-26T18:29:28.600 に答える
5

これがうまくいくものです:

data_file = open("test.txt")
block = ""
found = False

for line in data_file:
    if found:
        block += line
        if line.strip() == "End": break
    else:
        if line.strip() == "Start":
            found = True
            block = "Start"

data_file.close()
于 2011-09-26T18:23:48.697 に答える
3

正規表現は非常に簡単に使用できます。必要に応じてより堅牢にすることができます。以下は簡単な例です。

>>> import re
>>> START = "some"
>>> END = "Hello"
>>> test = "this is some\nsample text\nthat has the\nwords Hello World\n"
>>> m = re.compile(r'%s.*?%s' % (START,END), re.S)
>>> m.search(test).group(0)
'some\nsample text\nthat has the\nwords Hello'
于 2011-09-26T20:23:02.843 に答える
1

これはあなたの出発点になるはずです:

started = False
collected_lines = []
with open(path, "r") as fp:
     for i, line in enumerate(fp.readlines()):
         if line.rstrip() == "Start": 
             started = True
             print "started at line", i # counts from zero !
             continue
          if started and line.rstrip()=="End":
             print "end at line", i
             break
          # process line 
          collected_lines.append(line.rstrip())

enumerateジェネレーターはジェネレーターを取り、反復を列挙します。例えば。

  print list(enumerate("a b c".split()))

版画

   [ (0, "a"), (1,"b"), (2, "c") ]

更新

投稿者は、「===」や「======」などの行を一致させるために正規表現を使用するよう求めました。

import re
print re.match("^=+$", "===")     is not None
print re.match("^=+$", "======")  is not None
print re.match("^=+$", "=")       is not None
print re.match("^=+$", "=abc")    is not None
print re.match("^=+$", "abc=")    is not None
于 2011-09-26T18:22:51.373 に答える