首页 > 解决方案 > 如何确定文件类对象是否执行换行翻译?

问题描述

我有一个,它在作为参数接收的可搜索打开文件中执行某种二进制搜索。

该文件必须用open(..., newline="\n"), 否则如果.seek().tell()换行符翻译可能无法正常工作。

该库的 README 确实清楚地说明了这一点,但仍然很容易错过。我自己错过了,我想知道为什么事情不能正常工作。因此,如果库接收到执行文本翻译的类似文件的对象,我想让库引发错误或至少发出警告。是否可以进行此项检查?

标签: pythonpython-3.x

解决方案


我看到了两种解决方法。一个是 Python 3.7 的io.TextIOWrapper.reconfigure()(感谢@martineau!)。

第二个是做一些测试,看看seek/是否tell按预期工作。一个简单但低效的方法是:

from io import SEEK_END


def has_newlines_translated(f):
    f.seek(0)
    file_size_1 = len(f.read())
    file_size_2 = f.seek(0, SEEK_END) - 1
    return file_size_1 != file_size_2

通过逐个字符(使用f.read(1))读取直到超过第一个换行符并使用seek()/tell()来查看结果是否一致,可能会更有效地做到这一点,但这很棘手,并且并非在所有情况下都有效(例如,如果第一个换行符是单独的\n,而其他换行符是\r\n)。


推荐阅读