如何在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