0

Python は初めてで、基本的なログ ファイルの特定の行を選択するスクリプトを作成しています。

基本的に、この関数はファイルの行を検索し、別のファイルに出力したい行を見つけると、それをリストに追加し、その次の 5 行も追加します。これにより、別の関数の最後に別のファイルに出力されます。

それに続いて私がやろうとしてきたことは、ループをジャンプして、それらをもう一度繰り返すのではなく、これらの 5 行の最後の行から続行することです。コードの最後の行で問題が解決すると思っていましたが、残念ながらそうではありませんでした。

この目的で使用できる for ループの推奨されるバリエーションはありますか?

def readSingleDayLogs(aDir): 
print 'Processing files in ' + str(aDir)    + '\n'
lineNumber = 0
try:
    open_aDirFile = open(aDir)  #open the log file
    for aLine in open_aDirFile: #total the num. lines in file
        lineNumber = lineNumber + 1
    lowerBound = 0
    for lineIDX in range(lowerBound, lineNumber):          
        currentLine = linecache.getline(aDir, lineIDX)
        if (bunch of logic conditions):
                    issueList.append(currentLine)
                    for extraLineIDX in range(1, 6): #loop over the next five lines of the error and append to issue list
                        extraLine = linecache.getline(aDir, lineIDX+ extraLineIDX) #get the x extra line after problem line
                        issueList.append(extraLine)
                    issueList.append('\n\n')
                    lowerBound = lineIDX
4

3 に答える 3

1

whileループを使用する必要があります:

line = lowerBound
while line < lineNumber:
    ...
    if conditions:
        ...
        for lineIDX in range(line, line+6):
           ...
        line = line + 6
    else:
        line = line + 1
于 2013-01-29T17:20:16.430 に答える
0

forループは範囲全体でイテレータを使用するため、ループ変数を変更することができます。

代わりにwhileループの使用を検討してください。そうすれば、ラインインデックスを直接更新できます。

于 2013-01-29T17:20:11.907 に答える
0

私は次のようなものを見ます:

from itertools import islice

with open('somefile') as fin:
    line_count = 0
    my_lines = []
    for line in fin:
        line_count += 1
        if some_logic(line):
            my_lines.append(line)
            next_5 = list(islice(fin, 5))
            line_count += len(next_5)
            my_lines.extend(next_5)

このようにislice、入力に対して を使用することで、反復子を前に移動し、5 行 (ファイルの末尾に近い場合はおそらくそれより少ない行) が使い果たされた後に再開することができます。

これは、ファイルを順方向に読み、行を識別し、その時点以降の固定行数のみが必要であり、通常どおりループを再開できることを正しく理解している場合に基づいています。getline(それが唯一の目的であり、他の目的ではないように見えるため、それがすべての場合は行数を必要としない場合もあります)。

実際に次の 5 行を取りたいが、次の行を考慮したい場合は、 を使用itertools.teeして障害のある行のポイントで分岐し、それを使用して次の行で反復子を再開isliceさせることができます。fin

于 2013-01-29T17:19:24.650 に答える