700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > python按字节读文件-使用Python进行二进制文件读写(转)

python按字节读文件-使用Python进行二进制文件读写(转)

时间:2023-03-06 14:24:01

相关推荐

python按字节读文件-使用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字节数

x

pad byte

no value

1

c

char

string of length 1

1

b

signedchar

integer

1

B

unsignedchar

integer

1

?

_Bool

bool

1

h

short

integer

2

H

unsignedshort

integer

2

i

int

integer

4

I

unsignedint

integer or long

4

l

long

integer

4

L

unsignedlong

long

4

q

longlong

long

8

Q

unsignedlonglong

long

8

f

float

float

4

d

double

float

8

s

char[]

string

1

p

char[]

string

1

P

void*

long

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

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

CharacterByte orderSize and alignment

@

native

native 凑够4个字节

=

native

standard 按原字节数

<

little-endian

standard 按原字节数

>

big-endian

standard 按原字节数

!

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"来表示换行。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。