我想使用itertools.islice(self._f, 0, 100, None)
逐个读取文件(以100行为单位),如下所示:
f = open('test.dat', 'r')
while (some condition I look for):
f = open(fileName, 'r')
x = itertools.islice(f, 0, 100, None)
doSomethingWithX(x)
我的问题是,我不知道该文件有多长,我正在寻找一个条件来在文件结束时停止while循环。但我无法弄清楚它是如何完成的。
编辑:好的,我看到了困难。也许我应该重新提出问题,当itertools.islice被封装在像这样的类中时:class reader:
def __init__()
self._f = open('test.dat', 'r')
def getNext():
return itertools.islice(self._f, 0, 100, None)
R = reader()
while (some condition I look for):
x = R.getNext()
doSomethingWithX(x)
答案 0 :(得分:3)
如果您不介意获取列表切片,可以使用iter
:
with open(filename, 'r') as f:
for x in iter(lambda: list(itertools.islice(f, 100)), []):
doSomethingWithX(x)
不确定您使用的是哪个文件,因为您有f = ..
两次并且其中也有self_.f
。
使用您编辑的代码:
class reader:
def __init__(self):
self._f = open('out.csv', 'r')
def getNext(self):
return itertools.islice(self._f, 100)
R = reader()
import itertools
for x in iter(lambda: list(R.getNext()),[]):
print(x)
使用包含以下内容的测试文件和使用itertools.islice(self._f, 2)
的类代码:
1
2
3
4
5
6
7
8
9
10
输出:
In [15]: R = reader()
In [16]: import itertools
In [17]: for x in iter(lambda: list(R.getNext()),[]):
....: print(x)
....:
['1\r\n', '2\r\n']
['3\r\n', '4\r\n']
['5\r\n', '6\r\n']
['7\r\n', '8\r\n']
['9\r\n', '10']
答案 1 :(得分:0)
您可以使用readline
方法轻松处理100行的块。请执行以下操作:
def read_chunks(f, chunks=100):
block = True
while block:
block = [f.readline() for i in range(chunks)]
block = list(filter(None, block))
yield block
with open("filename") as f:
for lines in read_chunks(f):
print(len(lines), lines)
答案 2 :(得分:0)
所以我要找的是这样的:
class reader:
def __init__()
self._f = open('test.dat', 'r')
self._f.seek(0, os.SEEK_END) # find EOF
self._EOF = self._f.tell()
self._f.seek(0) # go back to beginning
def getNext():
if self._f.tell() != self._EOF:
x = np.genfromtxt(itertools.islice(self._f, 0, self._chunkSizes, None), dtype=np.float64)
return x
else:
return []
R = reader()
x = R.getNext()
while (x != []):
doSomethingWithX(x)
x = R.getNext()