如何在Python3中遍歷文件時找到文件指針的位置?在Python3中迭代遍歷文件的行時使用「tell()」的替代方法?
在Python 2.7中它很平凡,使用tell()
。在Python3相同的調用拋出OSError
:
Traceback (most recent call last):
File "foo.py", line 113, in check_file
pos = infile.tell()
OSError: telling position disabled by next() call
我的用例正在一個進度條讀取大的CSV文件。計算總計行數太貴,需要額外的通行證。近似值非常有用,我不關心緩衝區或其他噪聲源,我想知道它是否需要10秒或10分鐘。
重現問題的簡單代碼。它的工作原理上的Python 2.7的預期,但引發關於Python 3:
file_size = os.stat(path).st_size
with open(path, "r") as infile:
reader = csv.reader(infile)
for row in reader:
pos = infile.tell() # OSError: telling position disabled by next() call
print("At byte {} of {}".format(pos, file_size))
這個答案https://stackoverflow.com/a/29641787/321772表明,問題是next()
方法迭代過程中禁用tell()
。替代方法是逐行手動讀取,但該代碼位於CSV模塊內部,因此我不能理解它。我也無法通過禁用tell()
來了解Python 3的優點。
那麼在Python 3中遍歷文件的行時,找出字節偏移量的首選方法是什麼?
你可以使用'枚舉'並返回行號。就像那樣,你可以給用戶一些有用的東西,而不必遍歷文件兩次 –
@MaartenFabré當然,打印行號是很有用的,如果只是爲了顯示腳本沒有被卡住,並且它也是你所能做的不知道長度(即從標準輸入讀數)。但是,「完成55%,剩餘2分鐘」比「讀取10,543,000行」要好得多。 – Adam