1

我正在寻找一种 Python 方法,它可以从文件中读取多行(一次 10 行)。我已经调查过了readlines(sizehint),我尝试传递值 10 但不只读取 10 行。它实际上一直读取到文件末尾(我已经尝试过小文件)。每行有 11 个字节长,每次读取都应该获取 10 行。如果找到少于 10 行,则仅返回这些行。我的实际文件包含超过 150K 行。

知道如何实现这一目标吗?

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迭代器的一个小技巧。诀窍是zip(*[iter(iterator)]*n)分解iterator成大小为 n 的块。由于文件已经是类似生成器的迭代器(而不是类似序列),我们可以这样写:

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 回答