【问题标题】:Is there any way to find the buffer size of a file object有没有办法找到文件对象的缓冲区大小
【发布时间】: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


【解决方案1】:

在我看来,缓冲区大小在 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 字节,这将失败,但这对我的应用程序没有任何实际影响。

【讨论】:

  • 我看到open 采用了一个可选的buffering 参数来设置文件的缓冲区大小。你知道这与这个硬编码的缓冲区大小有什么关系吗?它们是不同的缓冲区还是什么?
  • @Emily -- 好问题。我实际上不确定。也许我需要比我更了解 C 源代码的人来看看...
  • 好吧,现在我很好奇,所以我开始了一个新问题:stackoverflow.com/questions/15991702/… 与此同时,我会继续探索源代码...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 2021-07-31
  • 2012-04-25
相关资源
最近更新 更多