在r和rb模式下解析文本文件之间的区别

MxL*_*evs 53 python file-io text-parsing

是什么让在'r'模式下解析文本文件比在'rb'模式下解析它更方便?特别是当有问题的文本文件可能包含非ASCII字符时.

lvc*_*lvc 62

这取决于你正在使用的Python版本.在Python 2中,Chris Drappier的答案适用.

在Python 3中,它是一个不同的(更一致的)故事:在文本模式('r')中,Python将根据您提供的文本编码来解析文件(或者,如果您不提供,则依赖于平台的默认值) ,并read()会给你一个str.在binary('rb')模式下,Python不假定文件包含可以合理地解析为字符的内容,并read()为您提供了一个bytes对象.

此外,在Python 3中,通用换行符(在'\n'平台特定的换行符之间进行转换,因此您不必关心它们)可用于任何平台上的文本模式文件,而不仅仅是Windows.

  • 对于py3,在文本模式下阅读会自动尝试检测它是什么类型的编码吗?我想必须检测编码对于字节对象来说是一个很大的挑战。 (2认同)
  • @Keikoku根据流单独检测编码,没有任何元数据是不可能的 - 考虑ASCII的各种编码+使用第8位信息而不是奇偶校验; 它们共享255个有效的单字节序列,但只有一半(ASCII半部分)代表每个字符中的相同字符.Python的默认值不是猜测它,它是一个会话范围的默认编码,拼写为`sys.getdefaultencoding()`.在我的Py3安装上,它的UTF-8,但你不能总是依赖于那种情况. (2认同)

Chr*_*ier 22

文件:

在Windows上,附加到模式的'b'以二进制模式打开文件,因此还有'rb','wb'和'r + b'等模式.Windows上的Python区分了文本和二进制文件; 读取或写入数据时,文本文件中的行尾字符会自动稍微改变.这种对文件数据的幕后修改适用于ASCII文本文件,但它会破坏像JPEG或EXE文件中的二进制数据.在读取和写入此类文件时要非常小心地使用二进制模式.在Unix上,将'b'附加到模式没有什么坏处,因此您可以独立于平台使用它来处理所有二进制文件.


shi*_*ing 12

不同之处在于如何处理行尾(EOL).不同的操作系统使用不同的字符来标记EOL - \n在Unix中,\r在OS X之前的Mac版本中,\r\n在Windows中.在文本模式下打开文件时,读取文件时,Python会用文件替换从文件中读取的特定于操作系统的行尾字符\n.反之亦然,即当您尝试写入\n以文本模式打开的文件时,它将编写特定于操作系统的EOL字符.您可以通过检查找到您的操作系统默认EOL os.linesep.

以二进制模式打开文件时,不会进行映射.你读的是你得到的.请记住,文本模式是默认模式.因此,如果您正在处理非文本文件(图像,视频等),请确保以二进制模式打开文件,否则您最终会通过引入(或删除)某些字节来弄乱文件.

Python也有一个通用的换行模式.在此模式下打开文件时,Python会映射所有字符\r,\n然后映射\r\n\n.