python新手,入手学习的是python3,第一次写慢慢改进
- 2018年8月7日开始学习,代码需要改进的肯定很多,目前是能达到基本完成需求,待继续学习之后才能优化
- 使用工具书是《Python编程:从入门到实践》袁国忠译版
- 获取软件所在路径
- 将hex(由Winavr二进制生成)格式转换为Boot_Source_J.bin
- 读取Boot_Source_J.bin文件并转存为Boot_Source_J.txt文本
- 将Boot_Source_J.txt文本生成指定的’0x某某’的格式
- 处理完成后可使用ctrl+V直接粘贴
-
须将此软件与hex(由Winavr二进制生成)格式文件放在相同文件夹下
-
准备运用环境:python3.5(win64)
-
实际运行环境:python3.4(win32)
-
解析:由于python3.4(32bit)打包的exe文件能在xp系统下运行
-
编写日期:2018年8月24日
-
作者:HConan
一、获取当前软件的路径
- 使用os模块、time模块
import os
import time
def gain_path():
"""获取软件所在文件夹的路径,及生成新的文件夹"""
path_source_old = os.getcwd()
# 在当前文件夹下创建新的文件夹
path_source_new = os.getcwd() + '\\Boot_C_' + time.strftime('%Y-%m-%d') + '\\'
if not os.path.exists(path_source_new):
os.makedirs(path_source_new)
# 获取新文件夹的路径
path_fold_source = path_source_old + '\Boot_C_' + time.strftime('%Y-%m-%d')
# 返回新文件夹的路径及原来的路径
return path_fold_source, path_source_old
二、获取当前软件路径下的hex文件,只识别处理一个hex文件
- 使用os模块
def get_filename():
"""获取软件所在文件夹下的.hex格式文件"""
filetype = '.hex'
path_fold_source, path_source_old = gain_path()
name = []
final_name = []
for root, dirs, files in os.walk(path_source_old):
for i in files:
if filetype in i:
name.append(i.replace(filetype, ''))
final_name = [item + '.hex' for item in name]
# 识别第一个hex文件
path_file_source = path_source_old + '\\' + final_name[0]
# 返回第一个hex文件的完整路径(含文件名)
return path_file_source
三、将hex文件转为“真”二进制格式bin
- 开始也试了直接使用hex读取,但是没有解决问题
def copy_hex_file():
"""将hex格式文件转为bin文件"""
path_fold_source_copy, path_source_old = gain_path()
path_file_source = get_filename()
try:
bin_source = open(path_fold_source_copy + "\Boot_Source_Z.bin", "wb")
with open(path_file_source, 'rb') as f_obj:
boot_source = f_obj.readlines()
except FileNotFoundError:
pass
else:
bin_source.writelines(boot_source)
bin_source.close()
四、读取bin文件
- 使用模块binascii
import binascii
def read_bin_file():
"""读取bin文件内容到txt文本"""
path_fold_source, path_source_old = gain_path()
bin_file_path = path_fold_source + "\Boot_Source_Z.bin"
txt_file_path = path_fold_source + "\Boot_Source_J.txt"
file = open(bin_file_path, 'rb')
open_txt_file_path = open(txt_file_path, 'w')
while 1:
c = file.read(1)
# 将字节转换成16进制
ssss = str(binascii.b2a_hex(c))[2:-1]
ssss = ssss.upper()
open_txt_file_path.writelines(ssss)
if not c:
break
file.close()
五、读取转换成的txt文件并对其进行格式处理
- 将整个文件以两个字节来分离,并对每两个字节前加“0x”、尾加“,\n”处理
- 使用的是正则表达方式
- 使用re模块
def change_boot(matched):
"""正则处理的函数"""
new_boot = '0x' + matched.group('new_boot') + ',\n'
return new_boot
def open_txt_file():
"""对boot源文件打开并进行格式处理"""
path_fold_source, path_source_old = gain_path()
path_txt_file_source = path_fold_source + "\etal_Boot_Source_J.txt"
try:
with open(path_txt_file_source) as f_obj:
boot_source = f_obj.read()
except FileNotFoundError:
pass
else:
# '(?P<名称>要求)'来表达python的正则规则
new_boot_file = re.sub('(?P<new_boot>[a-zA-Z0-9]{2})', change_boot, boot_source)
# 读取文件数来生成行数,需要改进
line_num = str(int(len(boot_source)/2))
print("\n\ta、生成Boot区文件共:" + line_num + "行")
# 返回新处理好的文本内容及文本行数
return new_boot_file, line_num
六、将处理好的文本内容,写入到新的TXT文本中,并在命名中带上日期、行数
- 使用模块 win32clipboard
- 使用模块 win32con
import win32clipboard as w
import win32con
def new_boot_file():
"""新建新的BOOT文本"""
new_boot_file, line_num = open_txt_file()
path_fold_source, path_source_old = gain_path()
path_new_file_source = path_fold_source + '\Boot_New_File_Line' + line_num + '_'
# 此处的时间若写到%H:%M:%S会出错
path_new_file_source += time.strftime('%Y-%m-%d') + '.txt'
with open(path_new_file_source, 'w') as f_obj:
f_obj.write(new_boot_file)
# 写入剪切板
w.OpenClipboard()
w.EmptyClipboard()
w.SetClipboardData(win32con.CF_UNICODETEXT, new_boot_file)
w.CloseClipboard()
七、运行
if __name__ == "__main__":
# 从下面开始运行
copy_hex_file()
read_bin_file()
new_boot_file()