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

server/2024/9/22 8:57:06/

在工作中碰到了一个问题,需要将原来用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 subprocessdef 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 chardetdef 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.ppmy.cn/server/120202.html

相关文章

解决uniapp开发的app,手机预览,上下滑动页面,页面出现拉伸,抖动的效果问题,

在pages.json文件里“globalStyle”下面的"app-plus"里加入"bounce": "none"即可 "app-plus": { "bounce": "none", //关闭窗口回弹效果 }

Facebook隐私设置指南:如何更好地保护个人信息

在数字化时代,隐私保护成为了每个互联网用户面临的重要课题。Facebook,作为全球最大的社交网络平台之一,拥有庞大的用户基础和丰富的个人数据。因此,了解和管理Facebook的隐私设置对保护个人信息至关重要。本文将为您提供一份详细…

刷题训练之字符串

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:熟练掌握字符串算法。 > 毒鸡汤:学习,学习,再学习 ! 学,然后知不足。 > 专栏选自:刷题…

ubuntu18.04升级到20.04

要将 Ubuntu 18.04 升级到 Ubuntu 20.04,你可以按照以下步骤进行操作。升级操作会涉及到系统的核心部分,建议在升级之前备份重要数据。 1. 备份数据 在进行系统升级之前,请确保备份重要的数据。可以使用 rsync、tar、或者系统备份工具来创建…

C++——模板初阶

目录 引言 泛型编程 函数模板 1.函数模板的基本用法 2.函数模板的原理 3.函数模板的实例化 3.1 隐式实例化 3.2 显式实例化 (1)先强制类型转换 (2)指定模板参数的实际类型 4.函数模板的匹配规则 类模板 1.类模板的基本用法 2.栈类模板的实现 3.类模板的实例化 …

在 macOS 上管理 Node版本

文章目录 1. 安装 nvm2. 验证 nvm 是否安装成功3. 使用 nvm 安装/切换 Node.js 版本4. 卸载 Node.js 版本 在 macOS 上管理 Node.js 版本,通常使用 nvm(Node Version Manager)是最便捷的方式。以下是安装和使用 nvm 来管理 Node.js 版本的步骤…

k8s下的网络通信与调度

目录 一、k8s网络通信 1、k8s通信整体架构 2、flannel网络插件 (1)flannel跨主机通信原理 (2)flannel支持的后端模式 3、calico网络插件 (1)简介 (2)网络架构 (…

【C++】模拟实现list

在上篇中我们已经了解过的list各种接口的功能使用,接下来我们就试着模拟实现一下吧! 注意:我们在此实现的和C标准库中实现的有所不同,其目的主要是帮助大家大概理解底层原理。list的底层结构是带头双向循环链表,是链表…