簡體   English   中英

Python:itertools.islice無法循環工作

[英]Python: itertools.islice not working in a loop

我有這樣的代碼:

#opened file f
goto_line = num_lines #Total number of lines
while not found:
   line_str = next(itertools.islice(f, goto_line - 1, goto_line))
   goto_line = goto_line/2
   #checks for data, sets found to True if needed

第一行的line_str是正確的,但此后的每一遍都將讀取不同的行。

因此,例如,goto_line以1000開始。它讀取1000行就好了。 然后,下一個循環goto_line是500,但不會讀取第500行。它讀取的行更接近1000。

我正在嘗試讀取大文件中的特定行,而不讀取多余的內容。 有時它會向后跳到一條線,有時會跳到一條線。

我確實嘗試過線緩存,但通常不會在同一文件上多次運行此代碼。

Python迭代器只能使用一次。 通過示例最容易看出這一點。 以下代碼

from itertools import islice
a = range(10)
i = iter(a)
print list(islice(i, 1, 3))
print list(islice(i, 1, 3))
print list(islice(i, 1, 3))
print list(islice(i, 1, 3))

版畫

[1, 2]
[4, 5]
[7, 8]
[]

切片總是從上次停止的地方開始。

使代碼工作最簡單的方法是使用f.readlines()獲取文件中的行列表,然后使用常規的Python列表切片[i:j] 如果您確實想使用islice() ,則可以每次使用f.seek(0)從頭開始讀取文件,但這效率非常低。

您不能(通過這種方式-可能有某種方式取決於文件的打開方式)返回文件。 標准文件迭代器(實際上,大多數迭代器-Python的迭代器協議僅支持正向迭代器) 向前移動。 因此,在讀取了k條線之后,再讀取另外k/2條線實際上就是第k+k/2條線。

可以嘗試將整個文件讀取到內存中,但是您有很多數據,因此內存消耗可能成為問題。 您可以使用file.seek滾動瀏覽文件。 但這仍然是很多工作-也許您可以使用內存映射文件 但是,只有在行大小固定的情況下才有可能。 如果有必要,您可以預先計算要檢查的行號,然后將所有這些行保存(不要太多,如果我沒記錯的話,大致應為int(log_2(line_count)) + 1 )。迭代,因此您不必在讀取整個文件后向后滾動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM