我正在寻找一种Python中的方法,它可以从文件中读取多行(一次10行)。我已经查看readlines(sizehint)
,我试图传递值10,但不会只读取10行。它实际上读到文件的末尾(我已经尝试过小文件)。每行长度为11个字节,每次读取每次应该取10行。如果找到少于10行,则仅返回那些行。我的实际文件包含超过150K行。
知道如何实现这个目标吗?
答案 0 :(得分: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
答案 1 :(得分: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')
答案 2 :(得分: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)
答案 3 :(得分: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