我有一个library,它在作为参数接收的可搜索打开文件中进行某种二进制搜索。
必须使用open(..., newline="\n")
打开文件,否则如果进行换行,则.seek()
和.tell()
可能无法正常工作。
该库的自述文件确实使这一点很清楚,但是仍然很容易错过。我本人很想念它,我想知道为什么事情无法正常进行。因此,如果它收到执行文本翻译的类似文件的对象,我想使该库引发错误或至少发出警告。可以进行检查吗?
答案 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
)。