文本和二进制文件:简要概述 | 第二部分 类型与操作 —— 第 9 章: 元组,文件和其他 |《学习 python:强大的面向对象编程(第 5 版)》| python 技术论坛-大发黄金版app下载
严格地说,在前一节的例子使用了文本文件。在python 3.x 和 2.x中,文件类型都被open
的第二参数决定,模式字符串——一个被包含的b
意外着二进制。python总是支持文本文件和二进制文件,但在python 3.x中二者的区别更加明显:
- 文本文件将内容表示为普通
str
字符串,自动执行unicode编码和解码,且默认执行“行尾转换”(译注:在windows上行尾终止符为\r\n
,而在基于unix的系统上是\n
。当在python中读取或写入文本文件时,解释器会自动根据当前的操作系统,处理行尾终止符的转换) - 二进制文件将内容表示为特殊的
bytes
字符串类型,且允许程序不变地访问文件内容。
in contrast, python 2.x text files handle both 8-bit text and binary data, and a special string type and file interface (unicode strings and codecs.open) handles unicode text. python 3.x 的差异来自这个事实:简单的和unicode的文本已经融合为普通的字符串类型——考虑到所有文本都是unicode(包括ascii和其它的8比特编码),这是有意义的。
因为大多数程序员只处理ascii文本,他们可以使用前一个例子中使用的基本的文本文件接口和普通字符串来勉强应付。在3.x中所有字符串技术上都是unicode,但ascii用户通常将不会注意到。事实上,如果脚本范围局限于那么简单的文本形式,那么文本文件和字符串在3.x和2.x中是一样的。
然而,如果需要处理国际化应用程序或面向字节的数据,3.x中的不同就会影响你的代码(通常是更好)。一般地,对二进制文件必须使用 bytes
字符串,对文本文件使用普通的 str
字符串。而且,因为文本文件实现了unicode编码,所以不应该以文本模式打开二进制文件——将其内容解码为unicode文本很可能会失败。
让我们看一个例子。当读取二进制数据文件时,返回一个bytes
对象——小整数的序列,代表绝对的字节值(它可能对应于字符,也可能不对应),它看起来和感觉起来几乎完全等同于普通字符串。在python 3.x中,并假设一个现存的二级制文件:
>>> data = open('data.bin', 'rb').read() # open binary file: rb=read binary
>>> data # bytes string holds binary data
b'\x00\x00\x00\x07spam\x00\x08'
>>> data[4:8] # act like strings
b'spam'
>>> data[4:8][0] # but really are small 8-bit integers
115
>>> bin(data[4:8][0]) # python 3.x/2.6 bin() function
'0b1110011'
另外,二进制文件不执行任何数据上的行尾转换;在3.x中,当读写时和在传输上实现unicode编码时,文本文件默认在所有形式与 \n
之间来回映射。binary files like this one work the same in python 2.x, but byte strings are simply normal strings and have no leading b when displayed, and text files must use the codecs module to add unicode processing.
然而,根据本周开始的说明,关于unicode文本和二进制数据文件在这里只能说这么多了,足够理解本章接下来的例子就可以了。因为许多python程序员对这个区别都没什么兴趣,所以为了快速了解,将把文件预览推迟到第4章且将完整讲述推迟到第37章。现在,让我们前进到一些更重要的文件实例来展示一些常见用例。