目录
需求 : 将算法给出的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, 比较麻烦(当然这也是有点, 但是我好像用不到这个功能)这里做了一点完善和自动化.
这里将实现拆解为一步一步的, 符合认知的规律.
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)
一些感想:
领导总是说过程不重要,总是强调结果. 但是我还是很享受做事情的过程的, 从出现的问题一点一点的完善代码, 整个过程还是挺有成就感的,这样学习也是最快的.
也许大家没有对错的分别,立场不同罢了,对立的话,矛盾是根本无法调和的.
共勉之.