Windows上python中二进制和文本I / O之间的区别

时间:2010-07-15 16:45:48

标签: python windows file file-io

我知道我应该使用"rb"而不是"r"打开二进制文件,因为Windows对二进制文件和非二进制文件的行为不同。

但我不明白如果我以错误的方式打开文件会发生什么,以及为什么这种区别是必要的。其他操作系统似乎通过同时处理两种文件来做得很好。

4 个答案:

答案 0 :(得分:24)

这是历史(或者我喜欢说,歇斯底里)的原因。文件打开模式继承自C stdio库,因此我们遵循它。

对于Windows,文本和二进制文件之间没有区别,就像在任何Unix克隆中一样。不,我的意思是! - 有文件系统/操作系统,其中文本文件与目标文件完全不同,等等。在某些情况下,您必须提前指定行的最大长度,并使用固定大小的记录......来自80列纸张打卡等的时间的化石。幸运的是,在Unices,Windows和Mac中并非如此。

然而 - 所有其他条件相同 - Unix,Windows和Mac hystorically 在输出流中使用哪些字符来标记一行的结尾(或者同样的事情,作为行之间的分隔符)。在Unix中,使用\ x0A(\ n)。在Windows中,使用两个字符\ x0D \ x0A(\ r \ n)的序列;在Mac上 - 只是\ xOD(\ r \ n)。以下是这两个符号使用起源的一些线索 - ASCII码10称为换行(LF),当发送到电传打字机时,会导致它向下移动一行(Y ++),改变其水平(X)位置。另一方面,回车(CR) - ASCII 13 - 将导致打印托架返回到行的开头(X = 0)而不向下滚动一行。因此,当将输出发送到打印机时,必须发送\ r和\ n,以便托架将移动到新行的开头。现在,当在终端键盘上打字时,操作员自然需要按一个键而不是两个用于行尾。在Apple上[]是关键'返回'(\ r \ n)。

无论如何,这就是事情的解决方法。 C的创建者担心可移植性 - 很多Unix都是用C语言编写的,不像以前那样,操作系统是用汇编语言编写的。所以他们不想处理有关文本表示每个平台的怪癖,所以他们根据不同的平台,输入和输出到文件上的飞行将是“打补丁”加入这个邪恶的黑客攻击,其I / O库,以便程序将看到新行 righteous ,Unix-way - as'\ n' - 无论是来自Windows的'\ r \ n'还是来自Mac的'\ r'。因此,开发人员无需担心程序运行的操作系统,它仍然可以读取和写入本机格式的文本文件。

但是有一个问题 - 并非所有文件都是文本,还有其他格式,并且它们对将一个字符替换为另一个字符非常敏感。因此,他们会称这些“二进制文件”并通过在模式中包含“b”来指示fopen() - 这将标记库不进行任何幕后转换。这就是它的方式:)

回顾一下,如果文件在二进制模式下以'b'打开,则不会进行转换。如果它在文本模式下打开,根据平台,可能会出现一些新行字符的转换 - 从Unix的角度来看。当然,在Unix平台上,读取/写入“文本”或“二进制”文件之间没有区别。

答案 1 :(得分:20)

此模式是关于行结尾的转换。

在文本模式下阅读时,平台的本机行结尾(Windows上为\r\n)将转换为Python的Unix风格\n行结尾。在文本模式下写入时,会发生相反的情况。

在二进制模式下,不会进行此类转换。

其他平台通常在没有转换的情况下运行良好,因为它们将行结尾本地存储为\n。 (Mac OS是一个例外,过去曾使用过\r。)但是依赖于此的代码是不可移植的。

答案 2 :(得分:1)

在Windows中,文字模式会将换行符\n转换为回车符后跟换行符\r\n

如果您以二进制模式阅读文本,则没有问题。如果您在文本模式下读取二进制数据,它可能会被破坏。

答案 3 :(得分:-2)

对于阅读文件,应该没有区别。写入文本文件时,Windows会自动搞乱你的换行符(它会在\r之前添加\n)。这就是你应该使用"wb"

的原因
相关问题