1

ファイルから複数行(一度に10行)を読み取ることができるPythonのメソッドを探しています。readlines(sizehint)値 10 を渡そうとしましたが、10 行しか読み取れません。実際にはファイルの最後まで読み取ります(小さなファイルで試しました)。各行の長さは 11 バイトで、読み取りごとに毎回 10 行をフェッチする必要があります。見つかった行が 10 行未満の場合は、それらの行のみを返します。実際のファイルには 15 万行を超える行が含まれています。

どうすればこれを達成できますか?

4

4 に答える 4

8

あなたが探しているitertools.islice()

with open('data.txt') as f:
    lines = []
    while True:
        line = list(islice(f, 10)) #islice returns an iterator ,so you convert it to list here.
        if line:                     
            #do something with current set of <=10 lines here
            lines.append(line)       # may be store it 
        else:
            break
    print lines    
于 2012-10-08T23:52:47.403 に答える
3

これでできるはず

def read10Lines(fp):
    answer = []
    for i in range(10):
        answer.append(fp.readline())
    return answer

または、リスト内包表記:

ten_lines = [fp.readline() for _ in range(10)]

両方の場合において、fp = open('path/to/file')

于 2012-10-08T23:47:16.547 に答える
1

ばかげた無限ループを取り除き、より使い慣れたループを使用できる別の解決策は、イテレータを使用した小さなトリックにfor依存しています。itertools.izip_longestトリックは、サイズ n のチャンクにzip(*[iter(iterator)]*n)分割することです。iteratorファイルはすでに (シーケンスのようなものではなく) ジェネレーターのようなイテレーターであるため、次のように書くことができます。

from itertools import izip_longest
with open('data.txt') as f:
    for ten_lines in izip_longest(*[f]*10,fillvalue=None):
        if ten_lines[-1] is None:
           ten_lines = filter(ten_lines) #filter removes the `None` values at the end
        process(ten_lines) 
于 2012-10-09T00:36:50.887 に答える
0
from itertools import groupby, count
with open("data.txt") as f:
    groups = groupby(f, key=lambda x,c=count():next(c)//10)
    for k, v in groups:
        bunch_of_lines = list(v)
        print bunch_of_lines
于 2012-10-09T00:16:07.380 に答える