Nas*_*nov 25
那么这是历史(或者我喜欢说,歇斯底里)的原因.文件打开模式继承自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库中,该文件的输入和输出将被动态"修补",以便程序将看到新的行是正义的,Unix方式 - 作为'\n' - 无论是来自Windows的'\ r \n'还是来自Mac的'\ r'.因此,开发人员无需担心程序运行的操作系统,它仍然可以读取和写入本机格式的文本文件.
但是有一个问题 - 并非所有文件都是文本,还有其他格式,并且它们对将一个字符替换为另一个字符非常敏感.所以他们虽然,我们将调用那些"二进制文件",并fopen()通过在模式中包含"b"来表示 - 这将标记库不进行任何幕后转换.这就是它的方式:)
因此,回顾一下,如果文件在二进制模式下以'b'打开,则不会进行任何转换.如果它在文本模式下打开,根据平台,可能会出现一些新行字符的转换 - 从Unix的角度来看.当然,在Unix平台上,读取/写入"文本"或"二进制"文件之间没有区别.
Tho*_*mas 21
此模式是关于行结尾的转换.
在文本模式下阅读时,平台的本机行结尾(\r\n在Windows上)将转换为Python的Unix风格\n行结尾.在文本模式下写入时,会发生相反的情况.
在二进制模式下,不进行这样的转换.
其他平台通常可以在没有转换的情况下正常运行,因为它们本身存储行结尾\n.(Mac OS是一个例外,过去曾经使用它\r.)然而,依赖于此的代码是不可移植的.
| 归档时间: |
|
| 查看次数: |
5288 次 |
| 最近记录: |