将数据保存为二进制文件有几个方面的好处,首先,将相同的内容保存为二进制文件时,其大小比保存为文本文件时小;其次,二进制文件用文本编辑器打开时无法识别,可以起到加密的作用;再次,将数据保存为二进制文件时可以自己指定文件的扩展名。[大谦Excel,dqexcel点com]
创建二进制文件并写入数据
本小节介绍创建新的二进制文件或打开已经存在的二进制文件并写入数据的操作。
【Excel VBA】
在Excel VBA中,用Open语句打开文件为Binary后写入数据,可以把数据保存为二进制文件。反过来,也可以打开二进制文件,并把文件中的数据写入到字符串中。
保存数据到二进制文件的语法格式为:
Open FileName For Binary Access Write As #FileNumber
下面的例子将一条直线段的起点坐标和终点坐标数据以二进制文件的形式进行保存,将文件名的扩展名指定为cad。
Sub SaveToBinary()
Dim intFileNum As Integer
Dim strFile As String
Dim varText As Variant
strFile = "D:\test.cad"
varText = "10 10 100 200" '直线段(10,10)-(100,100)
intFileNum = FreeFile() '找到空闲的文件号
If strFile <> "" Then '如果指定了非空的文件名
'打开该文件,准备作为二进制文件写入内容
Open strFile For Binary Access Write As #intFileNum
'写入文本框中的内容
Put #intFileNum, 1, varText
End If
'关闭文件号
Close #intFileNum
End Sub
运行过程,打开二进制文件test.cad并写入直线段数据。
【Python】
Python中可以使用open函数或struct模块实现二进制文件的读写。
使用open函数实现时只需要修改mode参数的取值即可。表3-5中列出了读写二进制文件时mode参数的设置,可见,这些参数与前面文本文件设置的基本相同,只是多了一个"b"。"b"是"binary",即二进制的意思。
表3-5 读写二进制文件时mode参数的设置
| 模式 | 说 明 |
|---|---|
| rb | 以二进制格式打开一个文件用于只读 |
| rb+ | 以二进制格式打开一个文件用于读写 |
| wb | 以二进制格式打开一个文件只用于写入,如果该文件已存在,则原有内容会被删除,如果该文件不存在,则创建新文件 |
| wb+ | 以二进制格式打开一个文件用于读写,如果该文件已存在则原有内容会被删除,如果该文件不存在,则创建新文件 |
| ab | 以二进制格式打开一个文件用于追加,如果该文件已存在,新的内容将会被写入到已有内容之后,如果该文件不存在,则创建新文件进行写入 |
| ab+ | 以二进制格式打开一个文件用于追加,如果该文件已存在,文件指针将会放在文件的结尾,如果该文件不存在,则创建新文件用于读写 |
二进制文件是以字节为单位存储的,所以使用file对象的write方法写入数据时需要先将数据从字符串转换为字节流,使用bytes函数进行转换,指定编码格式。从二进制文件读取数据时则需要对read方法读出的数据用decode方法进行解码,同样要指定编码格式。
下面假设要保存一个直线段图形的数据,包括直线段的起点坐标(10,10)和终点坐标(100,200),保存为二进制文件D盘下的test.cad,cad为自定义的扩展名。
>>> #mode参数的取值为"wb"
>>> f= open("D:\\test.cad","wb")
>>> #用字符串表示坐标数据,转换为字节流,写入文件
>>> #注意数据之间用空格进行了间隔
>>> f.write(bytes(("10 "+"10 "+"100 "+"200"),"utf-8"))
>>> f.close()
现在可以在D盘下找到刚刚创建的二进制文件test.cad。
使用Python的struct模块实现二进制文件的读写相对简单。下面用struct模块处理与上面相同的直线段数据的二进制文件写入和读取。使用struct模块,先要用import命令导入它。
>>> from struct import *
使用file读写的write方法写入数据时,使用了struct模块的pack函数将坐标数据转换为字符串,然后写入该字符串。函数的语法格式为:
pack(fmt, v1, v2, ...)
其中参数fmt指定数据的类型,如整型数字用"i"表示,浮点型数字用"f"表示。按照先后次序,每个数据都要指定数据类型。
>>> #打开二进制文件,mode参数的值为"wb"
>>> f=open("d:\\test2.cad", "wb")
>>> 写入数据,4个坐标值都是整型
>>> f.write(pack("iiii",10,10,100,200))
>>> f.close()
现在直线段的坐标数据被保存到D盘下的二进制文件test2.cad中了。
读取二进制文件
3.2.1小节介绍了创建或打开二进制文件并写入数据的情况,这里介绍如何将数据从二进制文件中读取出来。
【Excel VBA】
在Excel VBA中,用Open语句打开文件为Binary并读取数据。打开二进制文件的语法格式为:
Open FileName For Binary Access Read As #FileNumber
下面打开D盘下的二进制文件test.cad,读取文件中的数据并输出到立即窗口。
Sub OpenBinary()
Dim intFileNum As Integer
Dim varText As Variant
Dim strFile As String
strFile = "D:\Test.cad"
intFileNum = FreeFile() '找到空闲的文件号
If strFile <> "" Then '如果指定了非空的文件名
'打开该二进制文件
Open strFile For Binary Access Read As #intFileNum
Get #intFileNum, 1, varText
Debug.Print varText
End If
'关闭文件号
Close #intFileNum
End Sub
运行过程,在立即窗口中输入文件中的数据。
【Python】
使用open函数打开文件时将mode参数的值设置为rb或rb+,以二进制读取。然后用file对象的read方法读取数据。该数据不能直接用,还需要用decode方法以先前保存时使用的编码方式解码得到字符串。最后用split方法从该字符串获取直线段起点和终点的坐标数据字符串并用int函数转换为整型数字。
>>> f= open("D:\\test.cad","rb")
>>> ln=f.read().decode("utf-8") #读取数据,解码
>>> f.close()
>>> dt=ln.split(" ") #用空格分割字符串,得到坐标数据字符串
>>> x1=int(dt[0]) #数据字符串转换为整型数字
>>> x1
10
>>> y1=int(dt[1])
>>> y1
10
得到坐标数据后,就可以用绘图函数把直线段重新绘制出来。
使用struct模块读取数据时需要用该模块的unpack函数进行解包,解包得到的数据以元组形式返回。[大谦Excel,dqexcel点com]
>>> #打开二进制文件,mode参数的值为"rb"
>>> f=open("d:\\test2.cad", "rb")
>>> #用unpack函数解包数据,以元组形式返回
>>> (a,b,c,d)=unpack("iiii",f.read())
>>> print(a,b,c,d)
10 10 100 200
>>> type(a) #a变量的数据类型
<class 'int'>