为什么在Python中读写TOML时采用二进制模式?



在正常读取("r")模式下读取toml文件时,我得到一个错误

import tomli
with open("path_to_file/conf.toml", "r") as f: # have to use "rb" !
toml_dict = tomli.load(f)

TypeError: File must be open in binary mode,例如使用open('foo.toml', 'rb')

在写入toml文件时也会发生相同的情况。为什么?

tomli github readme说

文件必须以二进制模式打开(使用"rb"国旗)。二进制模式将强制将文件解码为UTF-8,并禁用通用换行符,这两者都是正确解析TOML所必需的。

我以为打字机的时代已经过去了,那为什么"通用换行符"还在呢?不允许吗?换行符表示LF (0x0A)或CRLF (0x0D 0x0A)"(可怜的Mac用户)-这也没有向我解释原因…那么,我错过了什么?

总结一下,问题中描述的问题/行为实际上是一个更一般问题的特殊情况:如何在使用Python的open内置功能读取文本文件时强制执行特定的解码。或者换句话说:确保文件具有特定的编码.

tomli要求用户处理文件IO,因此用户也可以在open(path-to-file, "r", encoding=...)中使用任意编码。但是,toml规范要求输入为UTF-8。tomli通过强制用户在读取文件时使用二进制模式"b"来实现这一要求,然后根据读取的字节(src)进行解码。

From docs of open:

如概述中所述,Python区分二进制和文本I/O。以二进制模式打开的文件(包括mode参数中的'b')将内容作为bytes对象返回,而不进行任何解码。在文本模式下(默认情况下,或者当't'包含在mode参数中时),文件的内容将作为str返回,字节已首先使用平台相关编码或使用给定的指定编码进行解码。

显然,tomli(我不知道那个模块)希望得到一个字节对象,而不是文本。

最新更新