我正在尝试“映射”一个非常大的 ascii 文件。基本上,我会读取行,直到找到某个标签,然后我想知道该标签的位置,以便稍后再次查找它以提取相关数据。
from itertools import dropwhile
with open(datafile) as fin:
ifin = dropwhile(lambda x:not x.startswith('Foo'), fin)
header = next(ifin)
position = fin.tell()
现在这个tell
没有给我正确的位置。这个问题以前已经以各种形式被问过。原因大概是因为 python 正在缓冲文件对象。所以,python 告诉我它的文件指针在哪里,而不是我的文件指针在哪里。我不想关闭这个缓冲...这里的表现很重要。然而,如果知道是否有一种方法可以确定 python 选择缓冲多少字节,那就太好了。在我的实际应用程序中,只要我关闭以Foo
, 没关系。我可以到处写几行。所以,我实际上计划做的是这样的:
position = fin.tell() - buffer_size(fin)
有什么办法可以找到缓冲区大小吗?
对我来说,缓冲区大小看起来是硬编码的在 Cpython 中为 8192。 据我所知,除了打开文件时读取一行之外,没有其他方法可以从 python 接口获取这个数字,执行f.tell()
找出 python 实际读取了多少数据,然后在继续之前返回到文件的开头。
with open(datafile) as fin:
next(fin)
bufsize = fin.tell()
fin.seek(0)
ifin = dropwhile(lambda x:not x.startswith('Foo'), fin)
header = next(ifin)
position = fin.tell()
当然,如果第一行是longer超过 8192 字节长,但这对我的应用程序没有任何实际影响。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)