如何确定类似文件的对象是否执行换行翻译?

时间:2019-02-13 19:28:24

标签: python python-3.x

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

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

该库的自述文件确实使这一点很清楚,但是仍然很容易错过。我本人很想念它,我想知道为什么事情无法正常进行。因此,如果它收到执行文本翻译的类似文件的对象,我想使该库引发错误或至少发出警告。可以进行检查吗?

1 个答案:

答案 0 :(得分:0)

我看到了两种解决方法。一个是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)。