python - 如何确定文件类对象是否执行换行翻译?
问题描述
我有一个库,它在作为参数接收的可搜索打开文件中执行某种二进制搜索。
该文件必须用open(..., newline="\n")
, 否则如果.seek()
有.tell()
换行符翻译可能无法正常工作。
该库的 README 确实清楚地说明了这一点,但仍然很容易错过。我自己错过了,我想知道为什么事情不能正常工作。因此,如果库接收到执行文本翻译的类似文件的对象,我想让库引发错误或至少发出警告。是否可以进行此项检查?
解决方案
我看到了两种解决方法。一个是 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
)。
推荐阅读
- elixir - 如何在 Elixir 中为 Uberauth 添加状态参数
- ocaml - 为多态变体类型编写类型签名时可以使用类型变量吗?
- android - 启动设置活动时的 Android 9 后退按钮无法正常工作
- python - 使用 datetime 作为存储在 JSON 中的计时器
- python - 基于单个特征集的分类精度
- php - Woocommerce 通过 Hook 的变化
- merge - Power Query - 合并查询返回 true 或 false
- powershell - 有没有办法在 PowerShell 中为 cmdlet 示例着色?
- reactjs - Uncaught Invariant Violation: Hooks 只能在函数组件内部调用
- gcc - “ld”抱怨“XCOFF32 成员在 64 位模式下被忽略”,即使库是 XCOFF64。为什么?