5

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

有什么办法可以找到缓冲区大小吗?

4

1 回答 1

2

对我来说,缓冲区大小在 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()

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

于 2013-04-13T02:53:30.710 回答