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

标签 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)

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

最佳答案

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

关于python - 有没有办法找到文件对象的缓冲区大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15979793/

相关文章:

windows - 操作系统缓冲文件有害吗?

python - 写入文件并询问用户文件名

ruby - 了解 Ruby 和操作系统 I/O 缓冲

lisp 读取命令对 sbcl 工作错误

Python Django 模板无法从模型函数获取名称

c - 用 C 写入文件的奇怪输出

c# - 用所有已注册的文件类型(不仅仅是扩展名)填充 ComboBox 的最有效方法是什么

python - 为什么 Python 的 __import__ 需要 fromlist?

python - 属性错误: 'Anonymousidentity' object has no attribute 'name'

python - 如何在已通过正则表达式过滤的 pandas DataFrame 上使用 .apply 函数?