Python islice一次读取N行的问题

Python islice一次读取N行的问题,python,performance,chunks,Python,Performance,Chunks,我试图使用“from itertools import islice”,以便使用liblas模块从*.las文件中一次读取多行。(我的目标是逐块阅读) 问题如下: islice()可用于获取迭代器的下n个项。因此 list(islice(f,n))将返回文件接下来n行的列表 F在循环中使用此选项将以n块的形式显示文件 线在文件末尾,列表可能会更短,最后 调用将返回一个空列表 我使用了以下代码: from numpy import nonzero from liblas import file a

我试图使用“from itertools import islice”,以便使用liblas模块从*.las文件中一次读取多行。(我的目标是逐块阅读)

问题如下:

islice()可用于获取迭代器的下n个项。因此 list(islice(f,n))将返回文件接下来n行的列表 F在循环中使用此选项将以n块的形式显示文件 线在文件末尾,列表可能会更短,最后 调用将返回一个空列表

我使用了以下代码:

from numpy import nonzero
from liblas import file as lasfile
from itertools import islice


chunkSize = 1000000

f = lasfile.File(inFile,None,'r') # open LAS
while True:
    chunk = list(islice(f,chunkSize))
    if not chunk:
        break
    # do other stuff
但我有一个问题:

len(f)
2866390

chunk = list(islice(f, 1000000))
len(chunk)
**1000000**
chunk = list(islice(f, 1000000))
len(chunk)
**1000000**
chunk = list(islice(f, 1000000))
len(chunk)
**866390**
chunk = list(islice(f, 1000000))
len(chunk)
**1000000**
当文件f最终到达时,islice将重新启动以读取该文件


谢谢你的建议和帮助。非常感谢

似乎编写一个生成器一次生成n行代码是很容易的:

def n_line_iterator(fobj,n):
    if n < 1:
       raise ValueError("Must supply a positive number of lines to read")

    out = []
    num = 0
    for line in fobj:
       if num == n:
          yield out  #yield 1 chunk
          num = 0
          out = []
       out.append(line)
       num += 1
    yield out  #need to yield the rest of the lines 
def n_line_迭代器(fobj,n):
如果n<1:
raise VALUE ERROR(“必须提供正数行才能读取”)
out=[]
num=0
对于fobj中的行:
如果num==n:
产出#产出1块
num=0
out=[]
out.append(行)
num+=1
让出#需要让出其余的线路

似乎编写一个生成器一次生成n行代码是很容易的:

def n_line_iterator(fobj,n):
    if n < 1:
       raise ValueError("Must supply a positive number of lines to read")

    out = []
    num = 0
    for line in fobj:
       if num == n:
          yield out  #yield 1 chunk
          num = 0
          out = []
       out.append(line)
       num += 1
    yield out  #need to yield the rest of the lines 
def n_line_迭代器(fobj,n):
如果n<1:
raise VALUE ERROR(“必须提供正数行才能读取”)
out=[]
num=0
对于fobj中的行:
如果num==n:
产出#产出1块
num=0
out=[]
out.append(行)
num+=1
让出#需要让出其余的线路

更改属于liblas包的
文件.py的源代码。目前,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


更改属于liblas包的
file.py
的源代码。目前,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


你的
lasfile.File
类型打破了所有迭代器的惯例?!我对lasfile.FileGah很反感,所以你的
lasfile.File
类型打破了所有迭代器惯例?!我在lasfile.FileThank上的表现真的很糟糕,但是在“if num=n:“文件有问题”中,第16行if num=n:^SyntaxError:无效syntax@Gianni--对不起,我出城一个星期了,显然忘了如何编码。那是个错误。我已经更新并修复了那个。如果你还有发现,请告诉我。没问题,谢谢!!!我在libals模块中遇到了非常糟糕的时刻。我无法分块阅读,我已经尝试了两天:(对不起,我很困惑——我发布的更新代码是否以某种方式失败?谢谢,但在“if num=n:”中有一个问题文件“”,如果num=n,则第16行:^Syntaxer:无效syntax@Gianni--对不起,我出城一周了,显然忘记了如何编写代码。这是一个错误。我已经更新并修复了这个错误。如果您发现任何其他错误,请告诉我。没问题,谢谢!!!我在libals模块中遇到了非常糟糕的时刻。我无法成片阅读,不是吗我试了两天:(抱歉,我很困惑——我发布的更新代码是否以某种方式失败了?谢谢halex,我在liblas上的表现真的很糟糕。昨天和今天我都在chunck中阅读,但是lasfile。文件类型打破了所有迭代器的惯例。我在google中跟踪所有示例,但总是有一个新问题。请看:这是一个非常有趣的d然而,您应该能够耗尽迭代器,我仍然不明白为什么它会循环,而不是需要一个新的循环来重新启动它…他们创建libals模块以读取Python中的*.las文件。*.las文件是存储“激光数据”的一种特殊格式称为激光雷达。las文件是一种ASPRS激光雷达数据交换格式,其中ASPRS是美国摄影测量和遥感学会示例:昨天我在xrange(0,len(f),chunkSize)中尝试了i:chunk=f[i:i+chunkSize]我通常的阅读方式是分块阅读文本文件,但什么都不读。当我到达文件末尾时,我收到一条消息ErrorThank halex,我和liblas的关系真的很糟糕。昨天和今天,我试图用chunck阅读,但lasfile。文件类型打破了所有迭代器的惯例。我在google中跟踪所有示例,但总是有一个新的问题lem.请看:这是一个非常有趣的设计。但是,你应该能够耗尽迭代器,我仍然不明白为什么它会循环,而不是需要一个新的循环来重新启动它…他们创建libals模块是为了读取Python中的*.las文件。*.las文件是存储“激光数据”的特殊格式称为激光雷达。las文件是一种ASPRS激光雷达数据交换格式,其中ASPRS是美国摄影测量和遥感学会示例:昨天我尝试了在xrange(0,len(f),chunkSize)中输入i:chunk=f[i:i+chunkSize],这是我用来读取文本文件的正常方式,但没有。当到达文件末尾时,我收到一条错误消息
def __iter__(self):
    """Iterator support (read mode only)

      >>> points = []
      >>> for i in f:
      ...   points.append(i)
      ...   print i # doctest: +ELLIPSIS
      <liblas.point.Point object at ...>
    """
    if self.mode == 0:
        self.at_end = False
        p = core.las.LASReader_GetNextPoint(self.handle)
        while p and not self.at_end:
            yield point.Point(handle=p, copy=True)
            p = core.las.LASReader_GetNextPoint(self.handle)
            if not p:
                self.at_end = True