【问题标题】:Opening a file in text mode can lead to data loss in Python: why?以文本模式打开文件会导致 Python 中的数据丢失:为什么?
【发布时间】:2011-05-17 20:25:59
【问题描述】:

codecs.open() 的文档提到

文件总是以二进制模式打开,即使没有指定二进制模式。这样做是为了避免由于使用 8 位值进行编码而导致数据丢失。

对文件使用文本模式如何导致“数据丢失”?听起来在文本模式下打开文件可能会将字节截断为 7 位,但我在文档中找不到任何提及这一点:文本模式是 described 仅作为转换换行符的一种方式,没有提及一些潜在的数据丢失。那么,codecs.open() 的文档是指什么?

PS:虽然可以理解将换行符自动转换为依赖于平台的换行符编码需要一些小心,但问题是关于 8 位编码的具体内容。我猜想只有 some 编码与自动换行符转换兼容,无论它们是 8 位还是 7 位编码。那么,为什么在codecs.open() 的文档中单独列出了 8 位编码?

【问题讨论】:

  • 我猜转换换行符可能会对文件中的数据产生影响。数据的含义相同,但例如,\r\n 可能仅转换为 \n。我真的不确定,但现在同样好奇。 +1 希望有人能解答。
  • @Endophage:是的,文本模式在写入时肯定会正确转换\n(这是有据可查的)。反向操作由U 模式(通用换行符)给出。

标签: python codec 8-bit 7-bit


【解决方案1】:

我认为它们的意思是某些编码至少在某些字节中使用所有 8 位,因此所有 256 个值都是可能的(特别是,有可能得到不表示 CR 或 LF 的 0x0A 或 0x0D) .

相比之下,在 UTF-8 文件中,CR 和 LF 字符(以及 0x80 以下的所有其他字符)总是转换为它们自己。它们不能作为其他字符编码的一部分出现。

【讨论】:

  • 有趣。现在,如果我理解正确,您是说codecs.open() 创建一个文件对象,该对象首先编码,然后执行可能“损坏”编码字节的换行符转换,对吧?我希望codecs 做相反的事情:首先执行换行符转换,然后编码,这将允许codecs.open 以文本模式写入......这是正确的吗?如果是,他们为什么不这样做??
  • 尽管这些关于 UTF-8 的评论很有趣,但我看不出它们如何解释“使用 8 位值的编码”的问题:ISO-8859-1(又名拉丁语 1)也对 8 位值进行编码,换行符的转换适用于拉丁语 1,就像它适用于 UTF-8 一样。所以,不清楚“8位编码”的问题是什么……
  • ... 我要补充一点,可以想象使用 0x0A 和 0x0D 作为某些字符编码的一部分的 7 位编码(这可能会与 codecs?? 混淆)。所以,再一次,我看不出 8 位编码的具体内容以及它们与codecs.open() 强制二进制模式的关系。欢迎任何其他讨论!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多