有没有办法找到文件对象的缓冲区大小

时间:2013-04-12 19:52:50

标签: python file io-buffering

我正在尝试“映射”一个非常大的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)

有没有办法找到缓冲区大小?

1 个答案:

答案 0 :(得分:2)

对我来说,看起来Cpython中的缓冲区大小为hard-coded为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()

当然,如果第一行更长超过8192字节,则会失败,但这对我的应用程序没有任何实际后果。