python定制文件设置文件图标

一、定制文件方格

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())

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值