使用Python进行二进制文件读写

总的感觉,python本身并没有对二进制进行支持,不过提供了一个模块来弥补,就是struct模块。

python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制数据,这也没关系,因为string是以1个字节为单位的。

 

import struct

a=12.34

#将a变为二进制

bytes=struct.pack('i',a)

 

此时bytes就是一个string字符串,字符串按字节同a的二进制存储内容相同。

再进行反操作

 

现有二进制数据bytes,(其实就是字符串),将它反过来转换成python的数据类型:

a,=struct.unpack('i',bytes)

注意,unpack返回的是tuple


所以如果只有一个变量的话:

bytes=struct.pack('i',a)

那么,解码的时候需要这样

a,=struct.unpack('i',bytes) 或者 (a,)=struct.unpack('i',bytes)

如果直接用a=struct.unpack('i',bytes),那么 a=(12.34,) ,是一个tuple而不是原来的浮点数了。

如果是由多个数据构成的,可以这样:

 

a='hello'

b='world!'

c=2

d=45.123

bytes=struct.pack('5s6sif',a,b,c,d)

 

此时的bytes就是二进制形式的数据了,可以直接写入文件比如 binfile.write(bytes)

然后,当我们需要时可以再读出来,bytes=binfile.read()

 

再通过struct.unpack()解码成python变量
a,b,c,d=struct.unpack('5s6sif',bytes)

 

'5s6sif'这个叫做fmt,就是格式化字符串,由数字加字符构成,5s表示占5个字符的字符串,2i,表示2个整数等等,下面是可用的字符及类型,ctype表示可以与python中的类型一一对应。

 

FormatC TypePython字节数
xpad byteno value1
ccharstring of length 11
bsigned charinteger1
Bunsigned charinteger1
?_Boolbool1
hshortinteger2
Hunsigned shortinteger2
iintinteger4
Iunsigned intinteger or long4
llonginteger4
Lunsigned longlong4
qlong longlong8
Qunsigned long longlong8
ffloatfloat4
ddoublefloat8
schar[]string1
pchar[]string1
Pvoid *long

 

最后一个可以用来表示指针类型的,占4个字节

为了同c中的结构体交换数据,还要考虑有的c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而还提供了

CharacterByte orderSize and alignment
@nativenative            凑够4个字节
=nativestandard        按原字节数
<little-endianstandard        按原字节数
>big-endianstandard       按原字节数
!network (= big-endian)standard       按原字节数

 

使用方法是放在fmt的第一个位置,就像'@5s6sif'

-----二进制文件处理时会碰到的问题-----

我们使用处理二进制文件时,需要用如下方法

binfile=open(filepath,'rb')    读二进制文件

binfile=open(filepath,'wb')    写二进制文件

那么和binfile=open(filepath,'r')的结果到底有何不同呢?
不同之处有两个地方:

 

第一,使用'r'的时候如果碰到'0x1A',就会视为文件结束,这就是EOF。使用'rb'则不存在这个问题。即,如果你用二进制写入再用文本读出的话,如果其中存在'0X1A',就只会读出文件的一部分。使用'rb'的时候会一直读到文件末尾。

 

第二,对于字符串x='abc/ndef',我们可用len(x)得到它的长度为7,/n我们称之为换行符,实际上是 '0X0A'。当我们用'w' 即文本方式写的时候,在windows平台上会自动将'0X0A'变成两个字符'0X0D','0X0A',即文件长度实际上变成8.。当用'r'文本方式读取时,又自动的转换成原来的换行符。如果换成'wb'二进制方式来写的话,则会保持一个字符不变,读取时也是原样读取。所以如果用文本方式写入,用二进制方式读取的话,就要考虑这多出的一个字节了。'0X0D'又称回车符。
linux下不会变。因为linux只使用'0X0A'来表示换行。

 

### 回答1: 二进制文件是一种以二进制形式存储数据的文件,与文本文件不同,它们不包含任何格式化的文本,而是包含计算机可以直接理解的二进制数据。在Python中,我们可以使用内置的open()函数来读写二进制文件。 要打开一个二进制文件,我们需要将文件模式设置为“rb”(读取二进制文件)或“wb”(写入二进制文件)。例如,要打开一个名为“example.bin”的二进制文件进行读取,我们可以使用以下代码: ``` with open("example.bin", "rb") as f: data = f.read() ``` 这将打开“example.bin”文件并将其内容读取到变量“data”中。我们可以使用相同的方式来写入二进制文件: ``` with open("example.bin", "wb") as f: f.write(data) ``` 这将把变量“data”中的内容写入到“example.bin”文件中。请注意,写入二进制文件时,我们需要确保我们写入的数据是二进制数据,而不是字符串或其他格式的数据。 ### 回答2: Python中的文件操作是非常重要的,许多常见的编程任务都涉及文件读写。其中,二进制文件读写更是需要特别注意。 二进制文件是指保存在计算机上的文件,其内容以二进制形式存储。相对于文本文件二进制文件通常更小,更快,并且可以直接访问文件中的任意位置。常见的二进制文件有图片、视频、音频等。 Python提供了许多函数来读取和写入二进制文件。 开始讲解二进制文件的读取。打开二进制文件的过程与打开文本文件相同,只需要在打开文件时指定打开方式为“rb”(读取二进制文件)。读取文件内容时采用read()函数进行读取,它将读取整个文件的内容并将其作为一个字符串返回。read()函数还接受一个参数,表示要读取的最大字节数。如果不传入该参数,则读取整个文件。读取二进制文件的示例代码如下: ```python with open("binary_file", "rb") as f: contents = f.read() # 读取整个文件 print(contents) ``` 接下来是二进制文件的写入。与读取类似,打开文件时需要指定打开方式为“wb”(写入二进制文件)。写入文件的内容可以使用write()函数进行写入,它接受一个二进制字符串作为参数,并将其写入文件。写入二进制文件的示例代码如下: ```python with open("binary_file", "wb") as f: f.write(b"Hello, world!") # 写入字符串 ``` 需要注意的是,写入二进制文件时需要使用二进制字符串(即在字符串前面加b),否则Python会将字符串转换为ASCII编码并写入文件,这样就无法正确地写入二进制数据了。 除了读取和写入整个文件,我们还可以使用seek()函数在二进制文件中定位到指定位置,并从该位置开始读取或写入数据。seek()函数接受两个参数,第一个参数表示要跳过的字节数,第二个参数表示跳跃的起点。如果第二个参数为0,则以文件起始位置为起点;如果为1,则以当前位置为起点;如果为2,则以文件末尾为起点。示例代码如下: ```python with open("binary_file", "rb") as f: f.seek(5) # 跳过前5个字节 contents = f.read(10) # 读取10个字节 print(contents) with open("binary_file", "wb") as f: f.seek(5, 0) # 跳到第5个字节 f.write(b"World") # 向文件中写入"World" ``` 通过上述介绍,我们知道了Python读写二进制文件的方法及注意事项,希望这篇文章对初学者有所帮助。 ### 回答3: Python文件读写是程序中非常基础和常用的一项功能。文件可以分为文本文件二进制文件二进制文件和文本文件不同的是,二进制文件并不是由一些可读的字符组成,而是由计算机能够识别的比特流组成,因此在读写二进制文件时需要使用二进制模式的文件操作。 在Python中,我们可以使用open()函数打开一个文件,而如果要打开二进制文件,需要在文件名的第二个参数中添加'b'。比如,我们可以使用以下代码读取一个二进制的图片文件: ```python with open('image.png', 'rb') as f: img_data = f.read() ``` 上述代码中,以二进制模式打开了一个名为image.png的文件,将文件中的内容读取到了一个变量img_data中。在读取完毕之后,使用with语句自动关闭了文件。 当我们要写入二进制文件时,我们也需要使用二进制模式的文件操作。比如,我们可以使用以下代码将一个字节串写入一个二进制文件中: ```python with open('binary.bin', 'wb') as f: f.write(b'\x00\x01\x02\x03') ``` 上述代码中,使用with语句打开了一个名为binary.bin的文件,并使用二进制模式打开,将一个字节串b'\x00\x01\x02\x03'写入了文件中。在写入完毕之后,使用with语句自动关闭了文件。 需要注意的是,二进制文件中包含的数据需要按照特定的格式进行解析才能正确读取。比如,在读取一个位图文件时,需要先读取文件头(header)中的各项属性,然后根据这些属性去解析文件中的像素数据。这就需要我们使用Python中的结构体(struct)模块,按照特定的格式读取二进制数据。例如: ```python import struct with open('bitmap.bmp', 'rb') as f: # 读取文件头 header = f.read(14) # 解析文件头 _, _, _, _, _, size, _, _, _, offset = struct.unpack('<2sIHHI', header) # 读取像素数据 f.seek(offset) data = f.read(size - offset) ``` 上述代码中,使用struct.unpack()解析了一个长度为14的文件头(header),然后根据header中的信息读取了像素数据。其中'<2sIHHI'用于表示不同属性的长度和类型,具体可以参考Python官方文档。 在处理二进制文件时还需要注意一些常见的问题,比如在读取或写入文件时,需要注意字节序(endian)的问题,需要进行正确的错误处理等。 总之,学习如何读写二进制文件Python编程中很重要的一环,可以帮助我们更好地处理计算机中的数据和文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值