Python:二进制文件读写

欢迎使用Markdown编辑器写博客

要求

打开一个文件,按照二进制读写数据。

解决

Python从文件中读取和写入的一般是字符串类型数据。因此,为了处理二进制数据,需要一种二进制数据到字符串数据的变换工具。

struct模块提供了所需功能。struct模块中最重要的三个函数是pack、unpack和calcsize。

  • pack(fmt,v1,v2,…)按照给定的格式,把数据封装成字符串
  • unpack(fmt,string)按照给定的格式解析字符串,返回解析出来的数据
  • calcsize(fmt)计算给定格式占用多少字节的内存

struct中支持的格式如下表:

format c Python byte
x pad byte no value 1
c char string of length 1 1
b char integer 1
B unsigned char integer 1
? bool bool 1
h short integer 2
H unsigned short integer 2
i int integer 4
I unsigned int integer or long 4
l long long 4
L unsigned long long 4
q longlong long 8
Q unsigned longlong long 8
f float float 4
d double float 8
s char[] string 1
p char[] string 1
P void* long 4

使用时:

  • 每个格式前可以有一个数字,表示个数
  • s格式表示一定长度的字符串,p表示Pascal格式的字符串

还可以将数组进行pack,例子如下:

import struct

a = [1, 2, 3, 4, 5]

data1 = struct.pack('5I', * a)
print(repr(data1))
#'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00'

data2 = struct.pack('5B', * a)
print(repr(data2))
#'\x01\x02\x03\x04\x05'

代码

#coding=utf-8

import struct

fin = open('c:/test_data/in.dat', 'rb') # 打开读入二进制文件.
read_buf = fin.read(16) # 读取16个字符(字节)
# 将16个字符转换为16个无符号整数,进行后续的二进制处理
data = struct.unpack('16B', read_buf) 
fin.close()


# 将16个字节转换为字符串后,输出到二进制文件中
fout = open('c:/test_data/out.dat', 'wb') # 打开写入二进制文件.

write_buf = struct.pack('16B', * data) # 将数据转化成字符串.
fout.write(write_buf)
fout.close()

你可能感兴趣的:(Python:二进制文件读写)