python3获取当前文件夹路径并在此路径下创建新的文件夹,解析当前路径下的hex(bin)二进制文件(由winavr生成),并将此二进制文件转换格式

python新手,入手学习的是python3,第一次写慢慢改进
  1. 获取软件所在路径
  2. 将hex(由Winavr二进制生成)格式转换为Boot_Source_J.bin
  3. 读取Boot_Source_J.bin文件并转存为Boot_Source_J.txt文本
  4. 将Boot_Source_J.txt文本生成指定的’0x某某’的格式
  5. 处理完成后可使用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()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值