首页 理论教育 Python程序设计基础教程:二进制文件操作

Python程序设计基础教程:二进制文件操作

时间:2023-11-16 理论教育 版权反馈
【摘要】:二进制文件的存储内容为字节码,甚至可以用一个二进制位来代表一个信息表示单位(位操作)。二进制文件一般采用随机存取。文本文件存放的是编码对应的字符,而二进制文件直接存储字节编码。程序执行到第6行,是以二进制格式打开了一个文件用于只读。例如:以下程序显示二进制文件file1的内容。

Python程序设计基础教程:二进制文件操作

二进制文件的存储内容为字节码,甚至可以用一个二进制位来代表一个信息表示单位(位操作)。而文本文件的信息表示单位至少是一个字符,有些字符用一个字节,有些字符可能用多个字节。二进制文件一般采用随机存取。

使用open()函数打开文件时,在打开方式中加上"b",如"rb"、"wb"、"ab"等,以打开二进制文件。文本文件存放的是编码对应的字符,而二进制文件直接存储字节编码。

1.read () 方法与write() 方法

二进制文件的读取和写入可以使用文件对象的read ()方法和write()方法,下面看一个例子。

【例6-1】从键盘输入一个字符串,以字节数据写入二进制文件;从文件末尾到文件头依次读取一个字符,对其加密后反向输出全部字符,加密规则是,对字符编码中的中间两个二进制位取反。

分析:对中间两个二进制位取反的方法是将读出的字符编码与二进制数0001100(也就是十进制数24)进行异或运算,将异或后的结果写回原位置。

程序输出结果如下:

程序执行第1 行,输入的字符串为 “abcd”。因为第3 行是以二进制格式打开“data30.txt”以用于写入,所以执行write (s)方法之前,在程序的第2 行就调用enode()函数将字符串转换为字节类型,否则程序会抛出TypeError异常。第5行,初始化一个空列表lst对象。程序执行到第6行,是以二进制格式打开了一个文件用于只读。从第8行到第12行为forin循环,程序循环变量n从1递增到字符串的长度,一共循环4次。在每次循环中,第9行调用seek (-n,2)的方法,以文件的末尾为基准开始偏移-n个字节。第10行调用read (1)方法读取一个字节,第11行再将这一个字节的字符用decode()先转成字符串型,再调用ord ()函数取得这个字符的ASII码值,然后与24做异或运算,然后再调用chr()函数转为字符。第12行,调用append ()方法将字符s追加列表lst中。因为程序的执行结果是倒序从字符中读取字符并加密,然后顺序写入列表lst中,运行结果为 “| {zy”。即 “d”加密后为 “|”,“c”加密后为“}”,“b”加密后为 “z”,“a”加密后为 “y”。例如 “d”的ASCII为十进制值为100,二进制值为01100100。01100100^00011000的计算结果为01111100,十进制为124,对应的ASCII码是“|”。

2.struct模块

read ()方法与write()方法是以字符串为参数,对于其他类型数据需要进行转换。Python没有二进制类型,但可以存储二进制类型的数据,就是用字符串类型来存储二进制数据。Python中的struct模块中的pack ()和unpack ()方法可以处理这种情况。

pack ()函数可以把整型 (或者浮点数)打包成二进制的字符串 (Python中的字符串可以是任意字节)。例如:

此时bytes就是一个4字节字符串,如果要写文件可以这样写语句。(www.xing528.com)

反过来,读文件的时候,可以一次读出4个字节,然后用unpack ()方法转换成Python的整数。

注意:unpack ()方法执行后得到的结果是一个元组

3.pickle模块

字符串很容易从文件中读写,数值则需要更多的转换,当处理更复杂的数据类型时,如列表、字典等,这些转换更加复杂。Python 带有一个pickle 模块,用于把Python对象(包括内置类型和自定义类型)直接写入到文件中,而不需要先把它们转化为字符串再保存,也不需要用底层的文件访问操作把它们写入到一个二进制文件里。

在pickle模块中有2个常用的方法:dump ()和load ()。

dump ()方法的用法如下:

其功能是直接把数据对象转换为字节字符串,并保存到文件中。例如:以下程序创建二进制文件file1。

load ()方法的用法如下:

其功能正好与上面的dump ()方法相反,load ()方法从文件中读取字符串,将它们转换为Python的数据对象,可以像使用通常的数据一样来使用它们。例如:以下程序显示二进制文件file1的内容。

程序运行结果如下:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈