在 Python 中以文本模式打开文件可能会导致数据丢失:为什么?
codecs.open()
的文档提到
即使未指定二进制模式,文件也始终以二进制模式打开。这样做是为了避免由于使用 8 位值编码而导致数据丢失。
对文件使用文本模式如何导致“数据丢失”?听起来以文本模式打开文件可能会将字节截断为 7 位,但我在文档中找不到任何提及这一点:文本模式是 仅描述为转换换行符的一种方式,没有提及一些潜在的数据丢失。那么,codecs.open() 的文档指的是什么呢?
PS:虽然可以理解自动换行符转换为平台相关的换行符编码需要一些小心,但问题是 8 位编码的具体情况。我猜测只有某些编码与自动换行符转换兼容,无论它们是8位还是7位编码。那么,为什么在 codecs.open()
的文档中单独列出 8 位编码呢?
The documentation for codecs.open()
mentions that
Files are always opened in binary mode, even if no binary mode was specified. This is done to avoid data loss due to encodings using 8-bit values.
How can using text mode for a file lead to "data loss"? It sounds like opening a file in text mode might truncate bytes to 7 bits, but I can't find any mention of this in the documentation: the text mode is described only as a way of converting newlines, with no mention of some potential data loss. So, what does the documentation for codecs.open()
refer to?
PS: While it is understandable that an automatic newline conversion to the platform-dependent newline encoding requires some care, the question is about what is specific about 8-bit encodings. I would have guessed that only some encodings are compatible with the automatic newline conversion, irrespective of whether they are 8- or 7-bit encodings. So, why are 8-bit encodings singled out, in codecs.open()
's documentation?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我认为他们的意思是,某些编码至少在某些字节中使用所有 8 位,因此所有 256 个值都是可能的(特别是,有可能获得不意味着 CR 或 LF 的 0x0A 或 0x0D)。
相反,在 UTF-8 文件中,CR 和 LF 字符(以及 0x80 以下的所有其他字符)始终转换为自身。它们不能作为其他字符的编码的一部分出现。
I think what they mean is that some encodings use all 8 bits in at least some bytes, so that all 256 values are possible (and in particular, it's possible to get 0x0A or 0x0D that don't mean CR or LF).
In contrast, in a UTF-8 file, CR and LF characters (and all other character below 0x80) always translate to themselves. They cannot appear as a part of encoding of some other character.