Python实践:一键批量替换不同文本字符串

该博客介绍了一个Python脚本,用于批量替换C代码中的数据类型定义。通过指定旧类型和新类型的映射,脚本可以遍历指定目录下的所有文件,将旧类型替换为新类型,以满足平台兼容性需求。脚本实现了读取文件、逐行替换和保存替换后内容的功能,确保文件编码为UTF-8,并支持类型映射的双向转换。
摘要由CSDN通过智能技术生成

Python实践:一键批量替换不同文本字符串

问题背景


由于部分项目有平台兼容性要求,为了使代码可移植,C代码中可能会利用宏命名,来控制类型定义。

如何将当前代码数据类型,批量替换为重定义后通用类型,成了我们要解决的问题。于是编写了以下Python脚本。

功能实现


功能需求:

  • 输入:
    • 给定两个相互映射的类型定义字符串集
    • 给定待转换的批量C代码文本文件,以UTF8编码
  • 输出:
    • 对同名文件进行修改,输出类型替换后的文本

实现思路:

  • 前处理:得到所有文件名字
  • 根据模式设置,确定老换新,还是新换老
  • 遍历所有文件,处理单个文件类型替换
    • 核心子函数:单文件处理
      • 取待替换类型字符串个数
      • 获得单个文件所有行文本
      • 对每行文本进行替换操作
      • 将替换后文本写入源文件

Python代码

# -*- coding: utf-8 -*-
"""
Created on Mon Mar 14 2022
@author: 来知晓NowKnow
filename: repalce_type_define.py
"""

import sys
import os


# repalce str_a with str_b
def file_process(file_path, a, b):
    print(file_path)
    lens = len(a)
    f = open(file_path, 'r+', encoding='utf-8')
    all_the_lines = f.readlines()
    f.seek(0)         # 移动文件指针,到最开始处
#    f.truncate()      # 从当前位置起,往后所有数据进行截断删除
    for line in all_the_lines:
        for i in range(lens):
            line = line.replace(a[i], b[i])
        f.write(line) # 向文件中按行写入替换后的文本
    f.close()
    return


# mode 0/1
# 0表示老到新,1表示新到老,其他则报错提示
def typedef_switch(dirc, old_type, new_type, mode):
    if mode != 0 and mode != 1:
        print('Mode set error, mode={}'.format(mode))
        return
    
    a = []
    b = []
    if mode == 0:
        a = old_type
        b = new_type
    else:
        b = old_type
        a = new_type        

    filelist = os.listdir(dirc)
    for file in filelist:
        file_path = os.path.join(dirc, file)
        file_process(file_path, a, b)


if __name__ == '__main__':
    # an example
    old_type = ['TYPEDEF_UINT8', 'TYPEDEF_INT8', 'TYPEDEF_CHAR',
              'TYPEDEF_UINT16', 'TYPEDEF_INT16',
              'TYPEDEF_UINT32', 'TYPEDEF_INT32',
              'TYPEDEF_UINT64', 'TYPEDEF_INT64',
              'TYPEDEF_FLOAT', 'TYPEDEF_DOUBLE',
              'TYPEDEF_UINTPTR', 'TYPEDEF_INTPTR',
              'TYPEDEF_NULL', 'TYPEDEF_VOID']
    new_type = ['uint8_t', 'int8_t', 'char',
              'uint16_t', 'int16_t',
              'uint32_t', 'int32_t',
              'uint64_t', 'int64_t',
              'float', 'double',
              'uintptr_t', 'intptr_t',
              'NULL', 'void']

    path1 = r'D:\workspace\src'
    typedef_switch(path1, old_type, new_type, 0)
    print('done!')

    # 正式退出main函数进程,以免main函数空跑
    sys.exit()

注意,以上代码需要保证每个文件均采用UTF8编码,且支持扩展,新老类型可相互转换,但要保证类型映射为一对一。

参考资料


  1. Python批量替换文件中指定字符串
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值