[英]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.