当前位置: 首页 > article >正文

Matlab 的.m 文件批量转成py文件

在工作中碰到了一个问题,需要将原来用matlab gui做出来的程序改为python程序,因为涉及到很多文件,所以在网上搜了搜有没有直接能转化的库。参考了【Matlab】一键Matlab代码转python代码详细教程_matlab2python-CSDN博客  这位博主提到的matlab2python工具,因为工具只能转换单个.m文件,对我这种需要批量转化一百多个文件的及其不友好,而且原来的注释里有中文,所以还需要把代码转为UTF-8格式。

1. matlab2python工具 下载

git clone https://github.com/ebranlard/matlab2python
cd matlab2python
pip install -r requirements.txt

如果实在翻不了墙的朋友,我看csdn下载资源里也能直接下载。下载了文件夹,按照上面的步骤把requirements.txt里的库装一下就好了。

2. 批量将.m转为.py

下面这个代码利用 subprocess 模块来执行

python matlab2python.py [m_file] -o [py_file]

完整代码:

import os
import subprocess

def convert_m_files_to_py(source_folder, destination_folder, converter_script):
    """
    遍历 source_folder 中的所有 .m 文件,使用 matlab2python.py 转换为 .py 文件,输出到 destination_folder。
    
    参数:
    - source_folder: 包含 .m 文件的文件夹路径
    - destination_folder: 转换后 .py 文件的输出文件夹
    - converter_script: matlab2python.py 脚本的路径
    """
    # 确保目标文件夹存在
    if not os.path.exists(destination_folder):
        os.makedirs(destination_folder)
    
    # 遍历源文件夹中的所有文件
    for filename in os.listdir(source_folder):
        # 检查文件是否为 .m 文件
        if filename.endswith('.m'):
            m_file_path = os.path.join(source_folder, filename)
            py_file_name = filename.replace('.m', '.py')
            py_file_path = os.path.join(destination_folder, py_file_name)
            
            # 调用 matlab2python.py 转换文件
            command = f'python {converter_script} "{m_file_path}" -o "{py_file_path}"'
            print(f'正在转换: {m_file_path} -> {py_file_path}')
            
            # 执行命令
            try:
                subprocess.run(command, shell=True, check=True)
            except subprocess.CalledProcessError as e:
                print(f"文件 {filename} 转换时出错: {e}")

if __name__ == "__main__":
    source_folder = r"F:\"  # 存放 .m 文件的文件夹路径
    destination_folder = r"F:\"  # 输出 .py 文件的文件夹路径
    converter_script = r"F:\matlab2python.py"  # matlab2python.py 文件的路径

    # 调用函数进行批量转换
    convert_m_files_to_py(source_folder, destination_folder, converter_script)

记得把这里文件夹路径改成自己的路径:

source_folder = r"F:\"  # 存放 .m 文件的文件夹路径
destination_folder = r"F:\"  # 输出 .py 文件的文件夹路径
converter_script = r"F:\matlab2python.py"  # matlab2python.py 文件的路径

3.批量将.py文件格式改为UTF-8

上面的代码运行下来会出现一个问题:

原来.m文件里的中文会出现乱码,这时候需要把文件统一转为UTF-8格式,因为不确定原来的代码是什么格式,所以这里我用了chardet 库来检测文件的原始编码,然后进行UTF-8转换。

先下载chardet

pip install chardet

然后完整代码:

import os
import chardet

def detect_file_encoding(file_path):
    """
    检测文件的编码
    :param file_path: 文件路径
    :return: 文件的编码格式
    """
    with open(file_path, 'rb') as f:
        raw_data = f.read()
        result = chardet.detect(raw_data)
        return result['encoding']

def convert_to_utf8(file_path):
    """
    将文件转换为 UTF-8 编码
    :param file_path: 需要转换的文件路径
    """
    try:
        # 检测文件的原始编码
        original_encoding = detect_file_encoding(file_path)
        if original_encoding is None:
            print(f"无法检测文件 {file_path} 的编码")
            return

        # 读取文件内容,使用检测到的编码
        with open(file_path, 'r', encoding=original_encoding, errors='ignore') as f:
            content = f.read()

        # 将内容重新保存为 UTF-8 编码
        with open(file_path, 'w', encoding='utf-8') as f:
            f.write(content)

        print(f"文件 {file_path} 已成功从 {original_encoding} 转换为 UTF-8 编码")
    except Exception as e:
        print(f"文件 {file_path} 转换失败: {e}")

def convert_folder_to_utf8(folder_path):
    """
    遍历文件夹并将所有 .py 文件转换为 UTF-8 编码
    :param folder_path: 需要转换的文件夹路径
    """
    for root, _, files in os.walk(folder_path):
        for file in files:
            if file.endswith('.py'):
                file_path = os.path.join(root, file)
                convert_to_utf8(file_path)

if __name__ == "__main__":
    folder_path = r"F:\"  # 指定需要转换的文件夹路径
    convert_folder_to_utf8(folder_path)

记得把这里的路径改成你需要批量处理的文件夹路径

folder_path = r"F:\"  # 指定需要转换的文件夹路径

 转换成功后再打开文件:

完成,撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。希望能帮上和我一样需求的朋友吧,这一天天的各种代码来回转真麻烦,能省点事是一点。


http://www.kler.cn/a/310415.html

相关文章:

  • Spring-Webflux + Reactor + Netty 初体验
  • 容器技术在DevOps中的应用
  • kafka面试题解答(四)
  • 【R78/G15 开发板测评】串口打印 DHT11 温湿度传感器、DS18B20 温度传感器数据,LabVIEW 上位机绘制演化曲线
  • 【MySQL】MySQL函数之JSON_EXTRACT
  • C++面试基础知识:排序算法 C++实现
  • HTML讲解(一)body部分
  • IDEA去除掉虚线,波浪线,和下划线实线的方法
  • 【微服务-注册中心】
  • 初识Maven:Java项目管理工具
  • 鸿蒙Harmony应用开发,数据驾驶舱 项目结构搭建
  • Android使用LiquidFun物理引擎实现果冻碰撞效果
  • JAVA网络编程【基于TCP和UDP协议】超详细!!!
  • C编程演奏中文版“生日快乐歌”
  • Java html生成pdf和图片
  • 【kafka】基本概念
  • SAP学习笔记 - 开发06 - CDSView + Fiori Element 之 List Report
  • Vue3 项目引入阿里 iconfont 图标和字体的多种方式
  • 2024 VMpro 虚拟机中如何给Ubuntu Linux操作系统配置联网
  • 总结拓展十:SAP开发计划(上)
  • 新峰商城之分类三级联动实现
  • PyQt / PySide + Pywin32 + ctypes 自定义标题栏窗口 + 完全还原 Windows 原生窗口边框特效项目
  • html+css+js网页设计 旅游 龙门石窟8个页面
  • HarmonyOS ArkTS 用户首选项的开发及测试
  • AI大模型与产品经理:替代与合作的深度剖析
  • 概率论原理精解【14】