Cara menggunakan Python untuk membaca dan menulis fail binari

WBOY
Lepaskan: 2023-05-03 12:40:06
ke hadapan
3085 orang telah melayarinya

1. Pengenalan

Python perlu menggunakan modul struct untuk membaca dan menulis data binari fail untuk menukar format data C/C++ dan Python.

2. Pengenalan kepada modul struct

Fungsi yang paling biasa digunakan dalam modul struct ialah pack dan unpack Penggunaannya adalah seperti berikut:

函数 return explain
pack(fmt,v1,v2…) string 按照给定的格式(fmt),把数据转换成字符串(字节流),并将该字符串返回.
pack_into(fmt,buffer,offset,v1,v2…) None 按照给定的格式(fmt),将数据转换成字符串(字节流),并将字节流写入以offset开始的buffer中.(buffer为可写的缓冲区,可用array模块)
unpack(fmt,v1,v2……) tuple 按照给定的格式(fmt)解析字节流,并返回解析结果
pack_from(fmt,buffer,offset) tuple 按照给定的格式(fmt)解析以offset开始的缓冲区,并返回解析结果
calcsize(fmt) size of fmt 计算给定的格式(fmt)占用多少字节的内存,注意对齐方式

3. Format data fmt dalam modul struct sepadan dengan Jenis dalam C/C++ dan Python

Format C Type Python type Standard size
x pad byte no value
c char string of length 1
b signed 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 4
l long integer 4
L unsigned long integer 4
q long long integer 8
Q unsigned long long integer 8
f float float 4
d double float 8
s char[] string
p char[] string
P void * integer

4 Contoh

Nota: Dalam kod, < bermaksud endian kecil, > endian

import struct

# 打开文件
with open("binary_file.bin", "wb") as f:

    # 写入4个字节的整数(值为12345)
    int_value = 12345
    f.write(struct.pack("<i", int_value))

    # 写入8个字节的双精度浮点数(值为3.14159)
    double_value = 3.14159
    f.write(struct.pack("<d", double_value))

    # 写入一个字节的布尔值(值为True)
    bool_value = True
    f.write(struct.pack("<?", bool_value))

    # 写入一个定长字符串(10个字符,值为"hello")
    string_value = "hello".encode("utf-8")
    f.write(struct.pack("<5s", string_value))

    # 写入一个定长字节数组(20个字节,值为b"\x01\x02\x03...\x14")
    byte_array_value = bytes(range(1, 21))
    f.write(struct.pack("<20s", byte_array_value))

    f.close()

# 打开文件
with open("binary_file.bin", "rb") as f:

    # 读取4个字节,解析成一个整数
    int_value = struct.unpack("<i", f.read(4))[0]
    
    # 读取8个字节,解析成一个双精度浮点数
    double_value = struct.unpack("<d", f.read(8))[0]

    # 读取一个字节,解析成一个布尔值
    bool_value = struct.unpack("<?", f.read(1))[0]

    # 读取一个字符串,解析成一个定长字符串(10个字符)
    string_value = struct.unpack("<5s", f.read(5))[0].decode("utf-8")

    # 读取一个字节数组,解析成一个定长字节数组(20个字节)
    byte_array_value = struct.unpack("<20s", f.read(20))[0]

    # 打印结果
    print(f"int_value: {int_value}")
    print(f"double_value: {double_value}")
    print(f"bool_value: {bool_value}")
    print(f"string_value: {string_value}")
    print(f"byte_array_value: {byte_array_value}")

    f.close()
Salin selepas log masuk

5 . Maksud menambah u, r, b, f di hadapan rentetan Python

5.1. Tambah u

di hadapan rentetan, dan rentetan berikut dikodkan dalam format Unikod, biasanya digunakan di hadapan rentetan Cina , untuk mengelakkan masalah format penyimpanan kod sumber daripada menyebabkan aksara bercelaru apabila digunakan semula.

str= u&#39;hello&#39;
Salin selepas log masuk

5.2. Tambahkan r

sebelum rentetan untuk mengalih keluar mekanisme pemindahan garis serong ke belakang. (Aksara khas: itu, garis miring ke belakang ditambah huruf yang sepadan, menunjukkan makna khas yang sepadan, seperti "n" yang paling biasa bermaksud pemisah baris, "t" bermaksud Tab, dsb.)

str= r&#39;hello\n\t\n&#39;
Salin selepas log masuk

5.3 Penambahan Aksara b

sebelum rentetan menunjukkan bahawa rentetan itu daripada jenis bait.

bytes = b&#39;hello&#39;
Salin selepas log masuk

Dalam Python3, kaedah penukaran bersama antara bait dan str ialah

str.encode(‘utf-8&#39;)
bytes.decode(‘utf-8&#39;)
Salin selepas log masuk

5.4. Tambahkan f sebelum rentetan

Bermula dengan f bermakna pendakap disokong dalam rentetan. Ungkapan Python dalam, penggabungan rentetan

name = &#39;Lily&#39;
print(f&#39;My name is {name}.&#39;)
Salin selepas log masuk

Atas ialah kandungan terperinci Cara menggunakan Python untuk membaca dan menulis fail binari. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!