Python 多文件合并 / 二进制合并 binMerge (手把手教程)

目录

这里直接给出代码

这里将实现拆解为一步一步的, 符合认知的规律.

1. 列出目录下所有的cfg 和 weight 文件

2. 打印出每个文件的大小

3.调整文件的顺序,符合期望的顺序

4.将所有文件的内容写入到目标文件 all.bin

5.给出 #define的打印,方便写程序

一些感想:


需求 : 将算法给出的6个 cfg 文件和6个 weight 文件合并一个bin文件(用于一次加载,而不是分开接在来节省时间).

材料 : 算法特性的 6组 cfg 和 weight 文件

最终的效果 : 将12个文件合并成为一个bin文件, 并给出各个文件的 start address 和 size 的 #define

这里直接给出代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import glob
import os

list_cfg = glob.glob('*.cfg')
list_weight = glob.glob('*.weight')
list = list_cfg + list_weight
list.sort()
list.reverse()
print(list)

count = len(list)
print("file count :", count)

file = open("all.bin", 'wb')
all_size = 0

for i in range(0, count):
    path = "./" + list.pop()
    # print(path)
    all_size_string = '(' + all_size.__str__() + ')'
    if path[-1] == 'g':
        print('#define', path[2:-4].upper() + '_START_ADDRESS', all_size_string)
    else:
        print('#define', path[2:-7].upper() + '_START_ADDRESS', all_size_string)
    size = os.path.getsize(path)
    size_string  = '(' + size.__str__() + ')'    
    if path[-1] == 'g':
        print('#define', path[2:-4].upper() + '_SIZE', size_string)
    else:
        print('#define', path[2:-7].upper() + '_SIZE', size_string)
            
    all_size += size
    cfg = open(path, 'rb')
    file.write(cfg.read())
    cfg.close()
file.close()
print('All size:', all_size)

然后给出执行的输出, 直接复制到代码里面就可以直接使用.

之前有一个类似的项目, 我决定用更简单的做法实现,这里给出地址, 也是可以使用的,就是每次都要计算 start address 和 offset, 比较麻烦(当然这也是有点, 但是我好像用不到这个功能)这里做了一点完善和自动化.

https://gitee.com/sharkisyou/bin-merge


这里将实现拆解为一步一步的, 符合认知的规律.

1. 列出目录下所有的cfg 和 weight 文件

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import glob

list_cfg = glob.glob('*.cfg') #将所有的cfg文件放入list中
list_weight = glob.glob('*.weight') #将所有的weight文件放入list中
list = list_cfg + list_weight  #合并2组文件到list中
print(list)  #打印所有在list中的文件

count = len(list)  #计算list中的文件个数
print("file count :", count) #打印文件的个数

2. 打印出每个文件的大小

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import glob
import os

list_cfg = glob.glob('*.cfg')
list_weight = glob.glob('*.weight')
list = list_cfg + list_weight
print(list)

count = len(list)
print("file count :", count)

for i in range(0, count):
    path = "./" + list.pop() #出栈的形式弹出文件,并组合成文件的路径
    # print(path)
    size = os.path.getsize(path)#获取文件大小
    print(size) #打印文件大小

3.调整文件的顺序,符合期望的顺序

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import glob
import os

list_cfg = glob.glob('*.cfg')
list_weight = glob.glob('*.weight')
list = list_cfg + list_weight
list.sort() # 快速排序
list.reverse() # 逆序, 因为是栈, 所以要改为先进先显示
print(list)

count = len(list)
print("file count :", count)

for i in range(0, count):
    path = "./" + list.pop()
    print(path)
    size = os.path.getsize(path)
    print(size)

可以看到, 文件排序从默认的顺序改为了从A到Z的顺序

4.将所有文件的内容写入到目标文件 all.bin

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import glob
import os

list_cfg = glob.glob('*.cfg')
list_weight = glob.glob('*.weight')
list = list_cfg + list_weight
list.sort()
list.reverse()
print(list)

count = len(list)
print("file count :", count)

file = open("all.bin", 'wb') # 新建一个文件用来存储数据
all_size = 0  # 合并的总大小

for i in range(0, count):
    path = "./" + list.pop()
    # print(path)
    size = os.path.getsize(path)
    all_size += size  # 计算总大小
    cfg = open(path, 'rb') # 打开每个文件
    file.write(cfg.read()) # 读取每个文件,内容写入到 all.bin 中
    cfg.close() # 记得关闭文件
file.close() # 记得关闭文件
print('All size:', all_size) # 打印总大小

可以看到写入的总大小是正确的

5.给出 #define的打印,方便写程序

下面是对 cfg 做了处理, 没有做 weight 做处理, 结果就是 weight的显示有问题, 需要分开处理

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import glob
import os

list_cfg = glob.glob('*.cfg')
list_weight = glob.glob('*.weight')
list = list_cfg + list_weight
list.sort()
list.reverse()
print(list)

count = len(list)
print("file count :", count)

file = open("all.bin", 'wb')
all_size = 0

for i in range(0, count):
    path = "./" + list.pop()
    # print(path)
    all_size_string = '(' + all_size.__str__() + ')' # 将 int 转为 string, 来给 size 加上()
    print('#define', path[2:-4].upper() + '_START_ADDRESS', all_size_string)
    # 去掉 path 前面的./ 去掉后面的 .cfg, 之后加上 _START_ADDRESS
    size = os.path.getsize(path)
    size_string  = '(' + size.__str__() + ')'
    print('#define', path[2:-4].upper() + '_SIZE', size_string)
    # 去掉 path 前面的./ 去掉后面的 .cfg, 之后加上 _SIZE
    all_size += size
    cfg = open(path, 'rb')
    file.write(cfg.read())
    cfg.close()
file.close()
print('All size:', all_size)

cfg 的显示OK. weight的部分还要处理

最终的结果如开头的代码, 核心的部分如下:

for i in range(0, count):
    path = "./" + list.pop()
    # print(path)
    all_size_string = '(' + all_size.__str__() + ')'
    if path[-1] == 'g': # 用扩展名的最后一位做为判断一句, 如果是g就是 cfg, 其他的就是 weight
        print('#define', path[2:-4].upper() + '_START_ADDRESS', all_size_string)
        # 去掉 前2个 ./, 去掉后4个 .cfg, 然后转为大写
    else:
        print('#define', path[2:-7].upper() + '_START_ADDRESS', all_size_string)
        # 去掉 前2个 ./, 去掉后7个 .weight, 然后转为大写
    size = os.path.getsize(path)
    size_string  = '(' + size.__str__() + ')'    
    if path[-1] == 'g':
        print('#define', path[2:-4].upper() + '_SIZE', size_string)
    else:
        print('#define', path[2:-7].upper() + '_SIZE', size_string)

一些感想:

领导总是说过程不重要,总是强调结果. 但是我还是很享受做事情的过程的, 从出现的问题一点一点的完善代码, 整个过程还是挺有成就感的,这样学习也是最快的.

也许大家没有对错的分别,立场不同罢了,对立的话,矛盾是根本无法调和的.

共勉之.

  • 19
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔尊moon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值