在Python中以文本模式打开文件可能会导致数据丢失:为什么?

4
codecs.open()的文档提到文件总是以二进制模式打开,即使没有指定二进制模式。这是为了避免由于编码使用8位值而导致数据丢失。使用文本模式打开文件会导致什么样的“数据丢失”?听起来好像在文本模式下打开文件可能会将字节截断为7位,但我在文档中找不到任何关于此的提及:文本模式仅描述其作为一种转换换行符的方式,没有提到潜在的数据丢失。那么,codecs.open()的文档是指什么?PS:虽然可以理解自动换行符转换为平台相关的换行符编码需要一些注意,但问题是关于8位编码的具体内容。我猜想只有一些编码与自动换行符转换兼容,无论它们是8位还是7位编码。那么,为什么在codecs.open()的文档中单独提到8位编码?

我猜转换换行符可能会对文件中的数据产生影响。数据的含义不变,但例如,\r\n 可能会被转换为 \n。我真的不确定,但现在同样好奇。+1 希望有人能给出答案。 - Endophage
@Endophage:是的,文本模式在写入时肯定会执行正确的\n转换(这是有充分文献支持的)。相反的操作由U模式(通用换行符)给出。 - Eric O. Lebigot
1个回答

5

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

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


有趣。现在,如果我理解正确的话,您是说codecs.open()创建了一个文件对象,首先进行编码,然后执行可能“损坏”编码字节的换行符转换,对吗?我希望codecs做相反的事情:首先执行换行符转换,然后进行编码,这将允许codecs.open以文本模式写入...这是正确的吗?如果是,为什么他们没有这样做? - Eric O. Lebigot
尽管关于UTF-8的这些评论很有趣,但我不明白它们如何解释“使用8位值的编码”的问题:ISO-8859-1(又名Latin 1)也使用8位值进行编码,并且换行符的转换与Latin 1一样正常,就像UTF-8一样。因此,“8位编码”的问题并不清楚... - Eric O. Lebigot
我想补充说,人们可以想象出使用0x0A和0x0D作为某些字符编码的一部分的7位编码(这可能会干扰 codecs ??)。因此,我不认为8位编码与其与 codecs.open() 强制二进制模式之间的关系具有特殊性。欢迎进行任何额外讨论! - Eric O. Lebigot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接