繁体   English   中英

如何在达到EOF时停止使用itertools.islice进行迭代

[英]How to stop iterating using itertools.islice when EOF is reached

我想使用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)

如果您不介意获取列表切片,可以使用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']

您可以使用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)

所以我想要的是这样的:

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM