【发布时间】:2013-04-05 11:29:12
【问题描述】:
我正在尝试“映射”一个非常大的 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 告诉我它的文件指针在哪里,而不是我的文件指针在哪里。 I don't want to turn off this buffering ...这里的表现很重要。但是,很高兴知道是否有办法确定 python 选择缓冲多少字节。在我的实际应用中,只要我关闭以Foo 开头的行,没关系。我可以在这里和那里写几行。所以,我实际上打算做的是:
position = fin.tell() - buffer_size(fin)
有什么方法可以找到缓冲区大小吗?
【问题讨论】:
-
这里不使用 ftell(),而是将你跳过的行的长度加起来。
-
@RussellBorogove -- 这是我最初考虑的一种合理方法,但缺点是我需要假设没有从
fin读取任何内容。实际上,我希望从接收fin作为输入参数的函数中调用它。
标签: python file io-buffering