2

文字列を含むファイルがあります:

REALSTEP 12342 {2012-7-20   15:10:39};[{416 369 338};{423 432 349};{383 380 357};{399 401 242};{0 454 285};{457 433 115};{419 455 314};{495 534 498};][{428 377 336};{433 456 345};{386 380 363};{384 411 
REALSTEP 7191 {2012-7-20    15:10:41};[{416 370 361};{406 417 376};{377 368 359};{431 387 251};{0 461 366};{438 409 134};{429 411 349};{424 505 364};][{423 372 353};{420 433 374};{379 365 356};{431 387 2
REALSTEP 12123 {2012-7-20   15:10:42};[{375 382 329};{386 402 347};{374 378 357};{382 384 259};{0 397 357};{442 424 188};{398 384 356};{392 420 355};][{404 405 359};{420 432 372};{405 408 383};{413 407 
REALSTEP 27237 {2012-7-20   15:10:44};[{431 375 329};{416 453 334};{387 382 349};{397 403 248};{0 451 300};{453 422 131};{433 401 317};{434 505 326};][{443 384 328};{427 467 336};{391 386 344};{394 413 
FAKE 32290 {2012-7-20   15:10:48};[{424 399 364};{408 446 366};{397 394 389};{415 409 261};{0 430 374};{445 428 162};{432 416 375};{431 473 380};][{424 398 376};{412 436 372};{401 400 390};{417 409 261}
FAKE 32296 {2012-7-20   15:10:53};[{409 326 394};{445 425 353};{401 402 357};{390 424 250};{0 420 353};{447 423 143};{404 436 351};{421 527 420};][{410 332 400};{450 429 356};{402 403 356};{391 425 250}
FAKE 32296 {2012-7-20   15:10:59};[{381 312 387};{413 405 328};{320 387 376};{388 387 262};{0 402 326};{417 418 177};{407 409 335};{443 502 413};][{412 336 417};{446 437 353};{343 417 403};{417 418 258}
FAKE 32295 {2012-7-20   15:11:4};[{377 314 392};{416 403 329};{322 388 375};{385 391 261};{0 403 329};{425 420 168};{414 393 330};{458 502 397};][{408 338 421};{449 435 355};{345 418 403};{413 420 257};
FAKE 32295 {2012-7-20   15:11:9};[{371 318 411};{422 385 333};{342 379 352};{394 395 258};{0 440 338};{418 414 158};{420 445 346};{442 516 439};][{401 342 441};{456 415 358};{367 407 377};{420 420 255};
FAKE 32296 {2012-7-20   15:11:15};[{373 319 412};{423 386 333};{344 384 358};{402 402 257};{0 447 342};{423 416 151};{422 450 348};{447 520 442};][{403 342 442};{456 416 358};{366 409 379};{422 421 255}
REALSTEP 7191 {2012-7-20    15:10:41};[{416 370 361};{406 417 376};{377 368 359};{431 387 251};{0 461 366};{438 409 134};{429 411 349};{424 505 364};][{423 372 353};{420 433 374};{379 365 356};{431 387 2
REALSTEP 12123 {2012-7-20   15:10:42};[{375 382 329};{386 402 347};{374 378 357};{382 384 259};{0 397 357};{442 424 188};{398 384 356};{392 420 355};][{404 405 359};{420 432 372};{405 408 383};{413 407 
REALSTEP 27237 {2012-7-20   15:10:44};[{431 375 329};{416 453 334};{387 382 349};{397 403 248};{0 451 300};{453 422 131};{433 401 317};{434 505 326};][{443 384 328};{427 467 336};{391 386 344};{394 413 

readlines()を使用してファイルを読み取り、行をループして、文字列「REALSTEP」を含む3より大きい行の連続ブロックがある場合にのみ印刷したいと思います。したがって、この例では、期待される結果は次のとおりです。

REALSTEP 12342 {2012-7-20   15:10:39};[{416 369 338};{423 432 349};{383 380 357};{399 401 242};{0 454 285};{457 433 115};{419 455 314};{495 534 498};][{428 377 336};{433 456 345};{386 380 363};{384 411 
REALSTEP 7191 {2012-7-20    15:10:41};[{416 370 361};{406 417 376};{377 368 359};{431 387 251};{0 461 366};{438 409 134};{429 411 349};{424 505 364};][{423 372 353};{420 433 374};{379 365 356};{431 387 2
REALSTEP 12123 {2012-7-20   15:10:42};[{375 382 329};{386 402 347};{374 378 357};{382 384 259};{0 397 357};{442 424 188};{398 384 356};{392 420 355};][{404 405 359};{420 432 372};{405 408 383};{413 407 
REALSTEP 27237 {2012-7-20   15:10:44};[{431 375 329};{416 453 334};{387 382 349};{397 403 248};{0 451 300};{453 422 131};{433 401 317};{434 505 326};][{443 384 328};{427 467 336};{391 386 344};{394 413 

私はこれを試しました:

lines = f.readlines()
idx = -1
#loop trough all lines in the file
for i, line in enumerate(lines):
    if idx > i:
        continue
    else:
        if "REALSTEP" in line:
            steps = lines[i:i+3]
          #check for blokc of realsteps
            if is_block(steps, "REALSTEP") == 3:
                #prints the block up to the first next "FAKE STEP"
                lst = get_block(lines[i:-1])
                for l in lst:
                    print l[:200]
                idx =  i + len(lst)
                print "next block============"

ここで、関数is_blockは次のとおりです。

def is_block(lines, check):
    #print len(lines)
    bool = 1
    for l in lines:
        if check in l:
            bool = 1
        else:
            bool = 0
        bool = bool + bool
    return bool

および関数get_block:

def get_block(lines):
    lst = []
    for l in lines:
        if "REALSTEP" in l:
            #print l[:200]
            lst.append(l)
        else:
            break
    return lst

これは機能しますが、文字列「REALSTEPS」を含むすべての行を出力します。is_block(lines)のprint len(lines)は、関数が呼び出されたときに常に10であるため、そうではありません。

私は混乱しています、ここで私を助けてください!

4

2 に答える 2

5

必要なロジックを含む簡単なソリューションは次のとおりです。

to_print = []
count = 0
started = False
for line in f.readlines():
    if "REALSTEP" in line:
        if not started: 
            started = True
        to_print.append(line)
        count += 1
    else:
        if count > 3: print('\n'.join(to_print))
        started = False
        count = 0
        to_print = []

文字列「REALSTEP」が含まれている行はすべて有効としてカウントされます。目的の出力を生成します。

于 2012-07-25T19:41:27.323 に答える
0

この部分:

...
    if "REALSTEP" in line:
        steps = lines[i:i+3]
        for s in steps:
            print s[:200]  # <- right here
...

行を見つけるたびに"REALSTEP"、次の3行を取得して、すぐに印刷します。それはおそらくあなたが望んでいたものではありません。

于 2012-07-25T19:36:41.413 に答える