一、定制文件方格
pythonu定制文件格式.bay6,其中.bay6是自己定制的文件格式名称
代码:
import struct
def write_bay6_file(data, filename):
with open(filename, 'wb') as f:
# 将数据打包为二进制格式并写入文件
f.write(struct.pack('i', data))
def read_bay6_file(filename):
with open(filename, 'rb') as f:
# 从文件中读取并解包二进制数据
data = struct.unpack('i', f.read(4))[0]
return data
# 示例用法
data = 42
write_bay6_file(data, 'custom.bay6')
read_data = read_bay6_file('custom.bay6')
print(read_data)
参考资料:
Python模块之struct - 皓然123 - 博客园 (cnblogs.com)
Python的Struct模块,用法以及个人理解 - 个人文章 - SegmentFault 思否
Python中的struct - 知乎 (zhihu.com)
Python模块之struct - 皓然123 - 博客园 (cnblogs.com)
Python Struct库之pack和unpack举例详解_python_脚本之家 (jb51.net)
struct --- Interpret bytes as packed binary data — Python 3.12.5 文档
python如何处理字节数据打包,struct模块使用详解 (baidu.com)
Python使用struct模块_python struct模块-CSDN博客
Python中struct 模块的使用教程_python struct-CSDN博客
二、设置文件图标
代码:
import win32api
import win32con
def set_file_icon(file_path, icon_path):
win32api.SetFileAttributes(file_path, win32con.FILE_ATTRIBUTE_NORMAL)
win32api.SetFileAttributes(file_path, win32con.FILE_ATTRIBUTE_HIDDEN)
win32api.SetFileAttributes(file_path, win32con.FILE_ATTRIBUTE_SYSTEM)
key = win32api.RegOpenKeyEx(win32con.HKEY_CLASSES_ROOT, '.bay6', 0, win32con.KEY_SET_VALUE)
win32api.RegSetValueEx(key, '', 0, win32con.REG_SZ, icon_path)
# 示例用法
set_file_icon('my_file.bay6', 'y_icon.ico')
三、python以二进制方式读取读取图片文件,并将文件保存为另外一个名称
代码:
import os
def read_and_save_image(image_path, new_image_path):
with open(image_path, 'rb') as f_in:
image_data = f_in.read()
with open(new_image_path, 'wb') as f_out:
f_out.write(image_data)
# 指定原始图片路径和新图片名称
image_path = 'image.jpg'
new_image_path = 'new_image.jpg'
# 调用函数进行读取和保存
read_and_save_image(image_path, new_image_path)
四、Python 中使用 struct 模块的实例教程
基础打包与解包
- 打包单个整数:将一个整数打包成二进制数据。
import struct
# 打包一个整数
packed_data = struct.pack('i', 42)
print(packed_data) # 输出: b'*\x00\x00\x00'
- 解包二进制数据:将之前打包的二进制数据解包回整数。
# 解包
unpacked_data = struct.unpack('i', packed_data)
print(unpacked_data) # 输出: (42,)
处理多个数据类型
- 打包多种数据类型:同时打包整数、字符串和浮点数。
# 打包多个值,并使用不同的 format
packed_data = struct.pack('hi3sf', 12, 23, b'abc', 3.14)
print(packed_data)
- 解包多种数据类型:对打包的包含多种类型的数据进行解包。
# 解包
a, b, c, d = struct.unpack('hi3sf', packed_data)
print(a, b, c, d)
考虑字节序
- 大端序(Big-Endian)打包:使用大端序(网络字节序)打包数据。
# 大端序打包
big_endian_data = struct.pack('>i', 12345)
print(big_endian_data)
- 小端序(Little-Endian)打包:使用小端序打包数据。
# 小端序打包
little_endian_data = struct.pack('<i', 12345)
print(little_endian_data)
处理嵌套结构体
- 定义和打包嵌套结构体:定义包含嵌套结构体的格式字符串,并进行打包。
# 定义嵌套结构体格式化字符串
nested_format = '2sh'
outer_format = '4s' + nested_format
# 打包嵌套结构体数据
outer_packed_data = struct.pack(outer_format, b'abcd', b'xy', 123)
print(outer_packed_data)
- 解包嵌套结构体:对嵌套结构体的二进制数据进行解包。
# 解包嵌套结构体数据
outer_unpacked_data = struct.unpack(outer_format, outer_packed_data)
print(outer_unpacked_data) # 输出: (b'abcd', b'xy', 123)
应用场景示例
- 网络通信:在网络编程中,将数据打包成二进制格式进行传输,然后在接收端解包。
import struct
# 打包数据
data_to_send = struct.pack('i3sf', 123, b'abc', 3.14)
# 发送数据到网络 # 这里需要实际的网络发送代码
# 接收数据并解包
received_data = b'\x7b\x00\x00\x00abc\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00'
unpacked_data = struct.unpack('i3sf', received_data)
print(unpacked_data) # 输出: (123, b'abc', 3.14)
- 文件解析:读取二进制文件并按照特定格式解包文件内容。
import struct
# 读取二进制文件
with open('data.bin', 'rb') as file:
binary_data = file.read()
# 解包数据
unpacked_data = struct.unpack('i3sf', binary_data)
print(unpacked_data)
五、自己理解的资料
1.字节序
字节序有两种,分别是大端字节序(big-endian)和小端字节序(little-endian)。struct中区分如下。
代码:
import struct
# 打包一个整数
packed_data1 = struct.pack('i', 12345678)
packed_data2 = struct.pack('>i', 12345678)
packed_data3 = struct.pack('<i', 12345678)
packed_data4 = struct.pack('!i', 12345678)
print(f"packed_data1输出结果:{packed_data1}")
print(f"packed_data2输出结果:{packed_data2}")
print(f"packed_data3输出结果:{packed_data3}")
print(f"packed_data4输出结果:{packed_data4}")
运行结果:
由此可见:
packed_data1和packed_data3输出结果相;
packed_data2和packed_data4输出结果相;
六、创造性解决问题的代码
1.代码:
'''
修改成为正确的后缀可以显示图片
'''
def Create(read_path,save_path):
with open(read_path,'rb') as read_file:
data=read_file.read()
with open(save_path,'wb') as save_file:
save_file.write(data)
def OpenCreateData(binary_data_path,know_data_path):
with open(binary_data_path,'rb') as bf:
bf_data=bf.read()
with open(know_data_path,'wb') as knf:
knf.write(bf_data)
read_path='image.jpg'
save_path='白良贺.bai9'
know_path='白良贺.jpg'
Create(read_path,save_path)
OpenCreateData(save_path,know_path)
2.代码:
import struct
import os
'''
修改成为正确的后缀可以显示图片
'''
def pack_image_into_bay6(image_path, output_bay6_path):
with open(image_path, 'rb') as image_file:
image_data = image_file.read()
print(image_data,len(image_data)/1024)
with open(output_bay6_path, 'wb') as bay6_file:
# 写入文件头信息
# bay6_file.write(b'some_header1')
# 写入图片数据长度
# image_data_length = len(image_data)
# x=struct.pack('I', image_data_length)
# print(x)
# bay6_file.write(struct.pack('I', image_data_length))
# 写入图片数据
bay6_file.write(image_data)
# bay6_file.write(output_bay6_path)
def read_bay6_and_extract_image(read_path,bay6_path):
with open(read_path,'rb') as f:
contont=f.read()
with open(bay6_path, 'wb') as bay6_file:
bay6_file.write(contont)
# header = bay6_file.read(10) # 读取文件头
#
# image_data_length = struct.unpack('I', bay6_file.read(4))[0] # 读取图片数据长度
#
# image_data = bay6_file.read(image_data_length) # 读取图片数据
# 在这里可以对提取的图片数据进行进一步处理或保存
# 示例用法
image_path = 'image.jpg'
# output_bay6_path = 'packed_image.bay6'
output_bay6_path = 'T10_packed_image.bay6'
image_create='MyCreateImage.png'
pack_image_into_bay6(image_path, output_bay6_path)
read_bay6_and_extract_image(read_path=output_bay6_path,bay6_path=image_create)
七、定制的程序打开定制的格式
代码:
import sys, os
from PyQt5.QtWidgets import *
class myWin(QWidget):
def __init__(self):
super(myWin, self).__init__()
self.setWindowTitle('树容器')
self.resize(200,200)
self.setUI()
def setUI(self):
lay=QVBoxLayout()
self.setLayout(lay)
bt1=QPushButton(self)
bt1.clicked.connect(self.openTxt)
bt1.setText('打开')
lay.addWidget(bt1)
def openTxt(self):
path,_=QFileDialog.getOpenFileName(self,'打开bai6文件','','定制格式(*.bay6)')
with open(path,'rb') as f:
data=f.read()
save_path=QFileDialog.getExistingDirectory(self,'保存txt文件','')
with open(os.path.join(save_path,'白良贺.txt'),'wb') as f2:
f2.write(data)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = myWin()
window.show()
sys.exit(app.exec())