2

定義された行数の後に特定の文字列が繰り返されている巨大なデータファイルがあります。

最初の2つの「ランク」オカレンス間のジャンプをカウントします。たとえば、ファイルは次のようになります。

  1 5 6 8 Rank                     line-start
  2 4 8 5
  7 5 8 6
  5 4 6 4
  1 5 7 4 Rank                     line-end  
  4 8 6 4
  2 4 8 5
  3 6 8 9
  5 4 6 4 Rank

文字列Rankが3行ごとに繰り返されていることがわかります。したがって、上記の例では、ブロック内の行数は4です。私の質問は、python readline()を使用して行数を取得する方法です。

私は現在これに従っています:

data = open(filename).readlines()
count = 0
for j in range(len(data)):
  if(data[j].find('Rank') != -1): 
    if count == 0: line1 = j
    count = count +1 
  if(count == 2):
    no_of_lines = j - line1
    break

改善や提案は大歓迎です。

4

4 に答える 4

4

.readlines()行をカウントする単純なジェネレーター式Rankで十分な場合は使用しないでください。

count = sum(1 for l in open(filename) if 'Rank' not in l)

'Rank' not in l文字列が文字列に存在しないかどうかをテストするには十分'Rank'です。開いているファイルをループすると、すべての行がループされます。このsum()関数は1、 を含まない各行に対して生成されるすべての を合計し、それらRankのない行の数をRank示します。

Rankからまでの行を数える必要がRankある場合は、ちょっとしたitertools.takewhile魔法が必要です。

import itertools
with open(filename) as f:
    # skip until we reach `Rank`:
    itertools.takewhile(lambda l: 'Rank' not in l, f)
    # takewhile will have read a line with `Rank` now
    # count the lines *without* `Rank` between them
    count = sum(1 for l in itertools.takewhile(lambda l: 'Rank' not in l, f)
    count += 1  # we skipped at least one `Rank` line.
于 2012-12-03T09:59:23.933 に答える
2

'Rank'最初の2つの発生の間のジャンプを数える:

def find_jumps(filename):
    first = True
    count = 0
    with open(filename) as f:
        for line in f:
            if 'Rank' in line:
                if first:
                    count = 0 
                    #set this to 1 if you want to include one of the 'Rank' lines.
                    first = False                    
                else:
                    return count
            else:
                count += 1 
于 2012-12-03T10:12:45.463 に答える
1

7行のコード:

count = 0
for line in open("yourfile.txt"):
    if "Rank" in line: 
        count += 1
        if count > 1: break 
    elif count > 0: count += 1
print count
于 2012-12-03T10:25:02.010 に答える
1

各ブロックが「ランク」を含む行で始まるブロック内の行数を検索するとします。たとえば、サンプルには3つのブロックがあります。1つ目は4行、2つ目は4行、3つ目は1行です。

from itertools import groupby

def block_start(line, start=[None]):
    if 'Rank' in line:
       start[0] = not start[0]
    return start[0]

with open(filename) as file:
     block_sizes = [sum(1 for line in block) # find number of lines in a block
                    for _, block in groupby(file, key=block_start)] # group
print(block_sizes)
# -> [4, 4, 1]

すべてのブロックの行数が同じである場合、または次で始まる最初のブロックの行数を検索する場合'Rank'

count = None
with open(filename) as file:
     for line in file:
         if 'Rank' in line:
             if count is None: # found the start of the 1st block
                count = 1
             else: # found the start of the 2nd block
                break
         elif count is not None: # inside the 1st block
             count += 1
print(count) # -> 4
于 2012-12-03T10:25:20.930 に答える