基于pandoc的MarkDown格式与word相互转换小工具开发(pyqt5)
这里写目录标题
- 开发目标
- 准备工作
- 源代码
- 程序打包
- 其他事项
- 命令行使用pandoc
- 关于pandoc默认表格无边框的说明
开发目标
- 采用word格式模板,实现高级定制样式。
- 具备配置保存功能,方便快捷。
- 自定义转换选项、pandoc路径。
准备工作
开发环境:Win10 + Visual Studio Code
开发语言:python3.8
pandoc下载地址
https://github.com/jgm/pandoc/releases
解压缩后即得到直接使用的二进制文件pandoc.exe。
在python安装目录下执行,安装pyqt5库(PyQt5和pyqt5-tools为必选项,PyQtChart非必需):
.\python.exe -m pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple
.\python.exe -m pip install pyqt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple
.\python.exe -m pip install PyQtChart -i https://pypi.tuna.tsinghua.edu.cn/simple
在python安装目录下执行,安装pypandoc库:
.\python.exe -m pip install pypandoc -i https://pypi.tuna.tsinghua.edu.cn/simple
在python安装目录下执行,安装打包工具pyinstaller库:
.\python.exe -m pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple
在VS Code自定义设置文件settings.json,添加以下内容,明确pandoc路径:
"terminal.integrated.env.windows": {"PATH": "${env:PATH};D:\\noinst\\Python\\Python38-x64-pyqt5\\Scripts;D:\\noinst\\pandoc-3.6.3"},
源代码
VS Code中新建一个py文件,将以下内容复制进去:
import sys
import os
import time
import configparser
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,QLabel, QLineEdit, QPushButton, QFileDialog, QMessageBox,QCheckBox, QGroupBox, QProgressBar, QComboBox
)
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import QThread, pyqtSignal, QSettings
import pypandoc# 配置文件路径
CONFIG_FILE = "config.ini"class ConvertThread(QThread):"""用于后台执行转换任务的线程"""progress_updated = pyqtSignal(int)conversion_finished = pyqtSignal(bool, str)def __init__(self, input_path, output_path, options):super().__init__()self.input_path = input_pathself.output_path = output_pathself.options = optionsdef run(self):try:extra_args = []if self.options.get('use_template') and self.options.get('template_path'):extra_args.extend(["--reference-doc", self.options['template_path']])if self.options.get('add_toc'):extra_args.append("--toc")if self.options.get('metadata_title'):extra_args.extend(["--metadata", f"title={self.options['metadata_title']}"])# 模拟进度# for i in range(5):# time.sleep(0.1)# self.progress_updated.emit(i * 20)if self.options['conversion_direction'] == 'md_to_docx':pypandoc.convert_file(self.input_path,'docx',outputfile=self.output_path,format='markdown',extra_args=extra_args)else: # docx_to_mdpypandoc.convert_file(self.input_path,'markdown',outputfile=self.output_path,format='docx',extra_args=extra_args)self.progress_updated.emit(100)self.conversion_finished.emit(True, self.output_path)except Exception as e:self.conversion_finished.emit(False, str(e))class MarkdownWordConverter(QMainWindow):def __init__(self):super().__init__()self.config = configparser.ConfigParser()self.load_config() # 加载配置self.init_ui()self.check_pandoc()def init_ui(self):self.setWindowTitle("Markdown2Word")icon = QIcon("output.ico")self.setWindowIcon(icon)self.setGeometry(int(self.config.get('UI', 'window_x', fallback=100)),int(self.config.get('UI', 'window_y', fallback=100)),int(self.config.get('UI', 'window_width', fallback=600)),int(self.config.get('UI', 'window_height', fallback=450)))self.central_widget = QWidget()self.setCentralWidget(self.central_widget)self.main_layout = QVBoxLayout()self.central_widget.setLayout(self.main_layout)# Pandoc配置self.pandoc_group = QGroupBox("Pandoc配置 (必填)")self.pandoc_layout = QHBoxLayout()self.pandoc_label = QLabel("Pandoc路径:")self.pandoc_line_edit = QLineEdit(self.config.get('PATHS', 'pandoc_path', fallback=""))self.pandoc_browse_button = QPushButton("浏览...")self.pandoc_browse_button.clicked.connect(self.browse_pandoc_path)self.pandoc_layout.addWidget(self.pandoc_label)self.pandoc_layout.addWidget(self.pandoc_line_edit)self.pandoc_layout.addWidget(self.pandoc_browse_button)self.pandoc_group.setLayout(self.pandoc_layout)self.main_layout.addWidget(self.pandoc_group)# 转换方向self.direction_group = QGroupBox("转换方向")self.direction_layout = QHBoxLayout()self.conversion_direction = QComboBox()self.conversion_direction.addItems(["Markdown → Word", "Word → Markdown"])self.conversion_direction.currentTextChanged.connect(self.toggle_direction)self.direction_layout.addWidget(QLabel("选择方向:"))self.direction_layout.addWidget(self.conversion_direction)self.direction_group.setLayout(self.direction_layout)self.main_layout.addWidget(self.direction_group)# 文件选择self.file_group = QGroupBox("文件选择")self.file_layout = QVBoxLayout()# 输入文件self.input_layout = QHBoxLayout()self.input_label = QLabel("输入文件:")self.input_line_edit = QLineEdit(self.config.get('PATHS', 'last_input_path', fallback=""))self.input_browse_button = QPushButton("浏览...")self.input_browse_button.clicked.connect(self.browse_input_file)self.input_layout.addWidget(self.input_label)self.input_layout.addWidget(self.input_line_edit)self.input_layout.addWidget(self.input_browse_button)self.file_layout.addLayout(self.input_layout)# 输出文件self.output_layout = QHBoxLayout()self.output_label = QLabel("输出文件:")self.output_line_edit = QLineEdit(self.config.get('PATHS', 'last_output_path', fallback=""))self.output_browse_button = QPushButton("浏览...")self.output_browse_button.clicked.connect(self.browse_output_file)self.output_layout.addWidget(self.output_label)self.output_layout.addWidget(self.output_line_edit)self.output_layout.addWidget(self.output_browse_button)self.file_layout.addLayout(self.output_layout)self.file_group.setLayout(self.file_layout)self.main_layout.addWidget(self.file_group)# 转换选项self.options_group = QGroupBox("转换选项")self.options_layout = QVBoxLayout()# 模板选项self.template_layout = QHBoxLayout()self.use_template_check = QCheckBox("使用Word模板")self.use_template_check.setChecked(self.config.getboolean('SETTINGS', 'use_template', fallback=False))self.template_line_edit = QLineEdit(self.config.get('PATHS', 'template_path', fallback=""))self.template_line_edit.setEnabled(self.use_template_check.isChecked())self.template_browse_button = QPushButton("选择模板...")self.template_browse_button.setEnabled(self.use_template_check.isChecked())self.template_browse_button.clicked.connect(self.browse_template_file)self.use_template_check.stateChanged.connect(self.toggle_template_options)self.template_layout.addWidget(self.use_template_check)self.template_layout.addWidget(self.template_line_edit)self.template_layout.addWidget(self.template_browse_button)self.options_layout.addLayout(self.template_layout)# 其他选项self.add_toc_check = QCheckBox("添加目录 (仅Markdown→Word)")self.add_toc_check.setChecked(self.config.getboolean('SETTINGS', 'add_toc', fallback=False))self.metadata_layout = QHBoxLayout()self.metadata_label = QLabel("文档标题:")self.metadata_edit = QLineEdit(self.config.get('SETTINGS', 'metadata_title', fallback=""))self.metadata_layout.addWidget(self.metadata_label)self.metadata_layout.addWidget(self.metadata_edit)self.options_layout.addWidget(self.add_toc_check)self.options_layout.addLayout(self.metadata_layout)self.options_group.setLayout(self.options_layout)self.main_layout.addWidget(self.options_group)# 进度条self.progress_bar = QProgressBar()self.main_layout.addWidget(self.progress_bar)# 转换按钮self.convert_button = QPushButton("开始转换")self.convert_button.clicked.connect(self.start_conversion)self.main_layout.addWidget(self.convert_button)# 信号连接self.conversion_direction.currentIndexChanged.connect(self.update_ui_for_direction)self.update_ui_for_direction()def load_config(self):"""加载配置文件"""self.config.read(CONFIG_FILE, encoding='utf-8')if not self.config.has_section('PATHS'):self.config.add_section('PATHS')if not self.config.has_section('SETTINGS'):self.config.add_section('SETTINGS')if not self.config.has_section('UI'):self.config.add_section('UI')def save_config(self):"""保存配置文件(UTF-8编码)"""self.config.set('PATHS', 'pandoc_path', self.pandoc_line_edit.text())self.config.set('PATHS', 'last_input_path', self.input_line_edit.text())self.config.set('PATHS', 'last_output_path', self.output_line_edit.text())self.config.set('PATHS', 'template_path', self.template_line_edit.text())self.config.set('SETTINGS', 'use_template', str(self.use_template_check.isChecked()))self.config.set('SETTINGS', 'add_toc', str(self.add_toc_check.isChecked()))self.config.set('SETTINGS', 'metadata_title', self.metadata_edit.text())# 窗口状态self.config.set('UI', 'window_x', str(self.x()))self.config.set('UI', 'window_y', str(self.y()))self.config.set('UI', 'window_width', str(self.width()))self.config.set('UI', 'window_height', str(self.height()))# 关键修改:使用utf-8编码写入with open(CONFIG_FILE, 'w', encoding='utf-8') as f:self.config.write(f)def closeEvent(self, event):"""窗口关闭时保存配置"""self.save_config()event.accept()def check_pandoc(self):"""检查Pandoc是否可用"""config_path = self.pandoc_line_edit.text()if config_path and os.path.exists(config_path):return Truetry:default_path = pypandoc.get_pandoc_path()self.pandoc_line_edit.setText(default_path)return Trueexcept:self.pandoc_line_edit.setPlaceholderText("未检测到Pandoc,请手动指定路径")return Falsedef browse_pandoc_path(self):"""选择Pandoc可执行文件"""if sys.platform == "win32":file_filter = "Executable Files (*.exe)"default_path = "C:\\Program Files\\Pandoc\\pandoc.exe"else:file_filter = ""default_path = "/usr/local/bin/pandoc"file_path, _ = QFileDialog.getOpenFileName(self, "选择Pandoc可执行文件", self.pandoc_line_edit.text() or default_path, file_filter)if file_path:self.pandoc_line_edit.setText(file_path)os.environ["PATH"] = os.path.dirname(file_path) + os.pathsep + os.environ.get("PATH", "")def update_ui_for_direction(self):"""根据转换方向更新UI"""direction = self.conversion_direction.currentText()self.add_toc_check.setEnabled(direction == "Markdown → Word")if direction == "Markdown → Word":self.input_file_filter = "Markdown文件 (*.md *.markdown)"self.output_file_filter = "Word文档 (*.docx)"else:self.input_file_filter = "Word文档 (*.docx)"self.output_file_filter = "Markdown文件 (*.md)"# self.input_line_edit.clear()# self.output_line_edit.clear()def toggle_direction(self):self.input_line_edit.clear()self.output_line_edit.clear()if self.conversion_direction.currentText() == "Word → Markdown":self.add_toc_check.setCheckState(0)def toggle_template_options(self, state):"""切换模板选项的可用状态"""enabled = state == 2 # Qt.Checkedself.template_line_edit.setEnabled(enabled)self.template_browse_button.setEnabled(enabled)def browse_input_file(self):"""选择输入文件"""file_path, _ = QFileDialog.getOpenFileName(self, "选择输入文件", "", self.input_file_filter)if file_path:self.input_line_edit.setText(file_path)if not self.output_line_edit.text():base_path = os.path.splitext(file_path)[0]if self.conversion_direction.currentText() == "Markdown → Word":output_path = base_path + ".docx"else:output_path = base_path + ".md"self.output_line_edit.setText(output_path)def browse_output_file(self):"""选择输出文件"""file_path, _ = QFileDialog.getSaveFileName(self, "选择输出文件", self.output_line_edit.text() or os.path.expanduser("~"),self.output_file_filter)if file_path:self.output_line_edit.setText(file_path)def browse_template_file(self):"""选择Word模板文件"""file_path, _ = QFileDialog.getOpenFileName(self, "选择Word模板", self.template_line_edit.text() or os.path.expanduser("~"),"Word模板 (*.docx *.dotx)")if file_path:self.template_line_edit.setText(file_path)def validate_inputs(self):"""验证输入是否有效"""errors = []pandoc_path = self.pandoc_line_edit.text()if not pandoc_path or not os.path.exists(pandoc_path):errors.append("请指定有效的Pandoc路径")input_path = self.input_line_edit.text()if not input_path or not os.path.exists(input_path):errors.append("输入文件不存在")if not self.output_line_edit.text():errors.append("请指定输出路径")if self.use_template_check.isChecked():template_path = self.template_line_edit.text()if not template_path or not os.path.exists(template_path):errors.append("模板文件不存在")return errorsdef start_conversion(self):"""开始转换过程"""errors = self.validate_inputs()if errors:QMessageBox.warning(self, "输入错误", "\n".join(errors))return# 设置Pandoc路径pandoc_path = self.pandoc_line_edit.text()os.environ["PATH"] = os.path.dirname(pandoc_path) + os.pathsep + os.environ.get("PATH", "")options = {'conversion_direction': 'md_to_docx' if self.conversion_direction.currentText() == "Markdown → Word" else 'docx_to_md','use_template': self.use_template_check.isChecked(),'template_path': self.template_line_edit.text(),'add_toc': self.add_toc_check.isChecked(),'metadata_title': self.metadata_edit.text()}self.progress_bar.setValue(0)self.convert_button.setEnabled(False)self.convert_thread = ConvertThread(self.input_line_edit.text(),self.output_line_edit.text(),options)self.convert_thread.progress_updated.connect(self.update_progress)self.convert_thread.conversion_finished.connect(self.conversion_complete)self.convert_thread.start()def update_progress(self, value):"""更新进度条"""self.progress_bar.setValue(value)def conversion_complete(self, success, message):"""转换完成处理"""self.convert_button.setEnabled(True)if success:QMessageBox.information(self, "成功", f"转换完成!\n文件已保存到:\n{message}")else:QMessageBox.critical(self, "错误", f"转换失败:\n{message}")self.progress_bar.setValue(0)if __name__ == "__main__":app = QApplication(sys.argv)# app.setStyle("Fusion") # 现代化界面风格# 首次运行时创建默认配置if not os.path.exists(CONFIG_FILE):with open(CONFIG_FILE, 'w') as f:config = configparser.ConfigParser()config.add_section('PATHS')config.add_section('SETTINGS')config.add_section('UI')config.write(f)converter = MarkdownWordConverter()converter.show()sys.exit(app.exec_())
点击运行,即可。
程序打包
为是程序不依赖于python环境,可移植于其他无Python的计算机上使用,可用pyinstaller包实现程序打包:
python_path\Scripts\pyinstaller.exe -F -w -i xxx.ico py_file.py
其他事项
命令行使用pandoc
在pandoc路径下,命令如下:
.\pandoc.exe test.md -o test.docx --reference-doc=template.docx
如果你希望转换后的 word 的标题、表格、内容字体等都按照预置的配置进行,则可以通过参数指定模板来进行转换,具体步骤如下:
.\pandoc.exe -o custom-reference.docx --print-default-data-file reference.docx
基于修改后的模板进行文档转换
.\pandoc.exe --reference-doc custom-reference.docx test.md -o test.docx
关于pandoc默认表格无边框的说明
直接修改模板中的表格样式(比如加个边框)是不起作用的,必须修改名称为 Table 的表格样式才有效,具体的修改方法如下图步骤。
其他事项参考:https://blog.csdn.net/catoop/article/details/123878342?spm=1001.2014.3001.5506
相关文章:
基于pandoc的MarkDown格式与word相互转换小工具开发(pyqt5)
这里写目录标题 开发目标准备工作源代码程序打包其他事项命令行使用pandoc关于pandoc默认表格无边框的说明 开发目标 采用word格式模板,实现高级定制样式。具备配置保存功能,方便快捷。自定义转换选项、pandoc路径。 准备工作 开发环境:Wi…...
JVM知识点(一)---内存管理
一、JVM概念 什么是JVM? 定义: Java Virtual Machine - java程序的运行环境(java二进制字节码的运行环境) 好处: 一次编写,到处运行自动内存管理,垃圾回收功能数组下标越界越界检查多态 比较jvm jre jdk区别 学习路…...
Apache NetBeans 25 发布
Apache NetBeans 25 已于 2025 年 2 月 20 日发布3。NetBeans 是一个主要面向 Java 的集成开发环境,同时支持 C/C、PHP、JavaScript 和其他编程语言1。以下是一些主要的更新内容: Gradle 的优化与增强:优化单文件测试功能,即使测试…...
【设计模式区别】装饰器模式和适配器模式区别
装饰器模式(Decorator Pattern)和适配器模式(Adapter Pattern)都是 结构型设计模式 或者说 包装模式 (Wrapper),用于解决对象的组合和扩展问题,但它们的核心目的、结构和使用场景有显…...
矫平机终极指南:特殊材料处理、工艺链协同与全球供应链管理
一、特殊材料矫平:挑战与创新解决方案 1. 高温合金(如Inconel 718)处理 技术难点: 屈服强度高达1100 MPa,传统矫平力不足 高温下易氧化,需惰性气体保护环境 解决方案: 采用双伺服电机驱动&a…...
stm32进入睡眠模式的几个注意点
(1)关闭systick (2)先关闭外设时钟,再屏蔽中断,避免先屏蔽中断再关闭外设时钟导致中断挂起无法进入睡眠模式(立即被唤醒)。 参考: 注:图片截自《RM0433参考手…...
深入理解网络安全中的加密技术
1 引言 在当今数字化的世界中,网络安全已经成为个人隐私保护、企业数据安全乃至国家安全的重要组成部分。随着网络攻击的复杂性和频率不断增加,保护敏感信息不被未授权访问变得尤为关键。加密技术作为保障信息安全的核心手段,通过将信息转换为…...
学习设计模式《六》——抽象工厂方法模式
一、基础概念 抽象工厂模式的本质是【选择产品簇(系列)的实现】; 抽象工厂模式定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类; 抽象工厂模式功能:抽象工厂的功能是为一系列相关对象或相互依…...
MySQL 数据类型
文章目录 数据类型数据类型分类数据类型tinyint类型(整型)总结bit类型(字节) 浮点类型float类型decimal类型 字符串类型char类型varchar(变长字符串) char 和 varchar的对比日期类型enum和set类型ÿ…...
基于Tcp协议的应用层协议定制
前言:本文默认读者已掌握 TCP 协议相关网络接口知识,将聚焦于应用层协议的设计与剖析,有关底层通信机制及业务逻辑部分仅作简要概述,不再展开详述。 目录 服务器 一、通信 二、协议 1.序列化与反序列化 2. 封包与解包 三、业…...
Flink反压问题解析
一、什么是反压(Backpressure)? 反压(Backpressure) 是流处理系统中的一种流量控制机制。当下游算子处理速度低于上游数据生产速度时,系统会向上游传递压力信号,迫使上游降低数据发送速率,避免数据堆积和系统崩溃。 Flink 通过动态反压机制实现这一过程,但其副作用是…...
C语言中结构体的字节对齐的应用
一、字节对齐的基本原理 计算机的内存访问通常以固定大小的块(如 4 字节、8 字节)为单位。若数据的内存地址是块大小的整数倍,称为 自然对齐。例如: int(4 字节)的地址应为 4 的倍数。 double(…...
大规模数据同步后数据总条数对不上的系统性解决方案:从字段映射到全链路一致性保障
一、引言 在数据同步(如系统重构、分库分表、多源整合)场景中,“本地数据一致,生产环境条数对不上”是典型痛点。问题常源于并发处理失控、数据库性能瓶颈、字段映射错误、缓存脏数据等多维度缺陷。本文结合实战经验,…...
美团Java后端二面面经!
场景题是面试的大头,建议好好准备 Q. [美团]如何设计一个外卖订单的并发扣减库存系统? Q.[美团]为啥初始标记和重新标记需要STW? Q.[美团]骑手位置实时更新,如何保证高并发写入? Q.[美团]订单表数据量过大导致查询…...
35-疫苗预约管理系统(微服务)
技术: RuoYi框架 后端: SpringBootMySQLspringCloudnacosRedis 前端: vue3 环境: Idea mysql maven jdk1.8 用户端功能 1.首页:展示疫苗接种须知标语、快速预约模块 2.疫苗列表:展示可接种的疫苗 3.预约接种: 用户可进行疫苗预约接种 修改预约时间 …...
Ext JS模拟后端数据之SimManager
Ext.ux.ajax.SimManager 是 Ext JS 框架中用于拦截 Ajax 请求并返回模拟数据的核心工具,适用于前后端分离开发、原型验证或独立测试场景。它通过配置灵活的规则和模拟处理器(Simlet),帮助开发者在不依赖真实后端的情况下完成前端功能开发。 simlets 是simulated servers的…...
BT169-ASEMI无人机专用功率器件BT169
编辑:ll BT169-ASEMI无人机专用功率器件BT169 型号:BT169 品牌:ASEMI 封装:SOT-23 批号:最新 引脚数量:3 特性:单向可控硅 工作温度:-40℃~150℃ BT169单向可控硅ÿ…...
4月26日星期六今日早报简报微语报早读
4月26日星期六,农历三月廿九,早报#微语早读。 1、广州多条BRT相关线路将停运,全市BRT客运量较高峰时大幅下降; 2、国务院批复:同意在海南全岛等15地设立跨境电商综合试验区; 3、我国首次实现地月距离尺度…...
如何将 sNp 文件导入并绘制到 AEDT (HFSS)
导入 sNp 文件 打开您的项目,右键单击 “Result” 绘制结果 导入后,用户可以选择它进行打印。请参阅下面的示例。要点:确保从 Solution 中选择它。...
Shell脚本-for循环应用案例
在Shell脚本编程中,for循环是一种强大的工具,用于处理重复性任务。无论是批量处理文件、遍历目录内容还是简单的计数任务,for循环都能提供简洁而有效的解决方案。本文将通过几个实际的应用案例来展示如何使用for循环解决具体的编程问题。 案…...
MATLAB基础应用精讲-【基础知识篇】发布和共享 MATLAB 代码
目录 MATLAB发布代码---生成文档pdf 分节符对发布文件的分节 实时脚本 Matlab workspace与m脚本数据共享 发布和共享 MATLAB 代码 在实时编辑器中创建和共享实时脚本 发布 MATLAB 代码文件 (.m) 添加帮助和创建文档 发布 MATLAB 代码文件 (.m) 可创建包括您的代码、注释…...
Shell脚本-while循环语法结构
在Shell脚本编程中,while循环是一种重要的流程控制语句,它允许我们重复执行一段代码,直到指定的条件不再满足为止。与for循环不同,while循环通常用于条件驱动的迭代,而不是基于列表或范围的迭代。本文将详细介绍Shell脚…...
Java基础第四章、面向对象
一、成员变量 示例: 二、JVM内存模型 类变量就是静态变量 三、构造方法 默认构造方法、定义的构造方法(不含参数、含参数) 构造方法重载: this关键字 this关键字应用:对构造方法进行复用,必须放在第一行 四、面向对象的三大特征 1…...
【基础IO上】复习C语言文件接口 | 学习系统文件接口 | 认识文件描述符 | Linux系统下,一切皆文件 | 重定向原理
1.关于文件的预备知识 1.1 文件的宏观理解 广义上理解,键盘、显示器等都是文件,因为我们说过“Linux下,一切皆文件”,当然我们现在对于这句话的理解是片面的;狭义上理解,文件在磁盘上,磁盘是一…...
linux离线部署open-metadata
OpenMetadata 环境及离线资源关闭防火墙禁止防火墙关闭 SELinux 创建用户安装JDK安装mysql安装Elasticsearch安装open-metadata 环境及离线资源 系统:CentOS Linux release 7.9.2009 (Core) JDK:17 Mysql: 8.0 OpenMetadata:1.6.…...
Exposure Adjusted Incidence Rate (EAIR) 暴露调整发病率:精准量化疾病风险
1. 核心概念 1.1 传统发病率的局限性 1.1.1 公式与定义 传统发病率公式为新发病例数除以总人口数乘以观察时间。例如在某社区观察1年,有10例新发病例,总人口1000人,发病率即为10/10001=0.01。 此公式假设所有个体暴露时间和风险相同,但实际中个体差异大,如部分人暴露时间…...
信令与流程分析
WebRTC是h5支持的重要特征之一,有了它,不再需要借助音视频相关的客户端,直接通过浏览器的Web页面就可以实现音视频聊天功能。 WebRTC项目是开源的,我们可以借助WebRTC,构建自己的音视频聊缇娜功能。无论是前端JS的Web…...
声音分离人声和配乐base,vocals,drums -从头设计数字生命第6课, demucs——仙盟创梦IDE
demucs -n htdemucs --two-stemsvocals 未来之窗.mp3 demucs -n htdemucs --shifts5 之.mp3demucs -n htdemucs --shifts5 -o wlzcoutspl 未来之窗.mp3 伴奏提取人声分离技术具有多方面的重大意义,主要体现在以下几个领域: 音乐创作与制作 创作便利…...
Chrmo手动同步数据
地址栏输入 chrome://sync-internals分别点击这2个按钮即可触发手动同步...
【Dify系列教程重置精品版】第1课 相关概念介绍
文章目录 一、Dify是什么二、Dify有什么用三、如何玩转Dify?从螺丝刀到机甲战士的进阶指南官方网站:https://dify.ai github地址:https://github.com/langgenius/dify 一、Dify是什么 Dify(Define + Implement + For You)。这是一款开源的大…...
【HTTP通信:生活中的邮局之旅】
HTTP通信:生活中的邮局之旅 HTTP通信就像是现代社会的邮政系统,让信息能够在互联网的城市间穿梭。下面我将用邮局比喻和图表来解释这个过程,以及它在现代应用中的重要性。 HTTP通信的旅程图解 #mermaid-svg-gC3zCsPpsFcq3sy3 {font-family:…...
Operating System 实验二 内存管理实验
目录 实验目标: 实验设备: 实验内容: (1)验证FIFO和Stack LRU页面置换算法 【代码(注释率不低于30%)】 【实验过程(截图)】 【结论】 (2)分别用FIFO和Stack LRU页置换算法,自己设定一个页面引用序列,绘制页错误次数和可用页帧总数的曲线并对比(可用Excel绘…...
深入解析YOLO v1:实时目标检测的开山之作
目录 YOLO v1 算法详解 1. 核心思想 2. 算法优势 3. 网络结构(Unified Detection) 4. 关键创新 5. 结构示意图(Fig1) Confidence Score 的计算 类别概率与 Bounding Box 的关系 后处理&…...
windows作业job介绍
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、作业job是什么?二、使用步骤1.代码示例 总结 前言 提示:这里可以添加本文要记录的大概内容: winapi网站: h…...
POLARIS土壤相关数据集
POLARIS相关数据集属于杜克大学(Duke University)土木与环境工程系(CEE)的水文学研究团队。该团队有三个总体主题:1) 改善地球系统模型中地表异质性的表示,2) 利用环境数据来描述在陆…...
【Harmony OS】组件
目录 组件概述 组件常用属性 系统内置组件 Text TextArea 多行文本输入框组件 TextInput 文本输入框 Button Image 图片组件,支持本地图片和网络图片 Radio 单选框 Checkbox 复选框 Blank 空白填充组件 Divider 分隔符 PatternLock 图案密码锁组件 Prog…...
找出字符串中第一个匹配项的下标
题目:28. 找出字符串中第一个匹配项的下标 给你两个字符串 haystack 和 needle,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1。 …...
专家系统的知识获取、检测与组织管理——基于《人工智能原理与方法》的深度解析
前文我们已经了解了专家系统的基本概念和一般结构,系统中有专业的知识才是专家系统的关键,接下来对专家系统中的知识是如何获取、检测、组织和管理的进行探讨。 1.专家系统的基本概念:专家系统的基本概念解析——基于《人工智能原理与方法》…...
BUUCTF-[GWCTF 2019]re3
[GWCTF 2019]re3 查壳,64位无壳 然后进去发现主函数也比较简单,主要是一个长度校验,然后有一个mprotect函数,说明应该又是Smc,然后我们用脚本还原sub_402219函数处的代码 import idc addr0x00402219 size224 for …...
基准指数选股策略思路
一种基于Python和聚宽平台的量化交易策略,主要包含以下内容: 1. 导入必要的库 - 导入jqdata和jqfactor库用于数据获取和因子计算。 - 导入numpy和pandas库用于数据处理。 2. 初始化函数 - 设置基准指数为沪深300指数。 - 配置交易参数,如使用…...
【阿里云大模型高级工程师ACP习题集】2.5 优化RAG应用提升问答准确度(⭐️⭐️⭐️ 重点章节!!!)
习题集 【单选题】在RAG应用的文档解析与切片阶段,若遇到文档类型不统一,部分格式的文档不支持解析的问题,以下哪种解决方式不可行?( ) A. 开发对应格式的解析器 B. 转换文档格式 C. 直接忽略该类型文档 D. 改进现有解析器以支持更多格式 【多选题】在选择向量数据库时,…...
【torch\huggingface默认下载路径修改】.cache/torch/ 或 .cache/huggingface
问题 服务器的硬盘空间是有限的,系统上的固态硬盘空间又比较小,在跑深度学习模型的时候经常有默认下载权重的操作,不管是torch或者huggingface,如果不加管理,所有的权重都放在home/user/.cache 里面,迟早会…...
SpringBoot 常用注解大全
SpringBoot 常用注解大全 一、核心注解 1. 启动类注解 SpringBootApplication:组合注解,包含以下三个注解 Configuration:标记该类为配置类EnableAutoConfiguration:启用自动配置ComponentScan:组件扫描 2. 配置相…...
【器件专题1——IGBT第2讲】IGBT 基本工作原理:从结构到特性,一文解析 “电力电子心脏” 的核心机制
IGBT(绝缘栅双极型晶体管,Insulated Gate Bipolar Transistor)作为现代电力电子领域的核心器件,其工作原理融合了 MOSFET 的高效控制优势与 BJT 的大功率处理能力。本文从物理结构、导通 / 关断机制、核心特性等维度,深…...
再谈String
1、字符串常量池 1.1 创建对象的思考 下面是两种创建字符串对象的代码 public static void main1(String[] args) {String s1 "hello";String s2 "hello";System.out.println(s1 s2);//trueString s3 new String("hello");String s4 new …...
语音合成之五语音合成中的“一对多”问题主流模型解决方案分析
语音合成中的“一对多”问题主流模型解决方案分析 引言“一对多”指的是什么?优秀开源模型的方法CosyvoiceSparkTTSLlaSA TTSVITS 引言 TTS系统旨在模仿人类的自然语音,但其核心面临着一个固有的挑战,即“一对多”问题 。这意味着对于给定的…...
嵌入式:Linux系统应用程序(APP)启动参数及其规则详解
在 systemd 的服务单元文件中,[Service] 部分用于定义服务的启动、停止、重启等操作,以及服务的运行环境和参数。以下是 [Service] 部分常见参数及其规则的详细介绍: 服务类型相关参数 **Type** **作用**:指定服务的启动类型&…...
25%甘油(灭菌)保存菌液以及10%甘油(普通)保存蛋白的原理及操作-实验操作系列-010
01 甘油保菌实验原理 1. 渗透压调节 甘油作为渗透压调节剂,能显著降低水的结冰温度,防止低温环境中细菌细胞内冰晶的形成。冰晶会破坏细胞膜,从而损伤细胞的完整性。甘油能够减少冰晶的生成,维持细胞结构的稳定,保护…...
影楼精修-手部青筋祛除算法解析
注意:本文样例图片为了避免侵权,均使用AIGC生成; 手部青筋祛除科普 手部青筋祛除是影楼精修中一个非常精细的工作,需要较高的修图技巧,目前市面上很少有自动化的青筋祛除功能的,而像素蛋糕目测是第一个做到…...
【时时三省】Python 语言----函数
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 1,函数概念 为了实现某种功能而组织的语句集合 定义格式: def 函数名([参数])函数体def add_num(a,b):c = a + bprint(c)add_num(11, 22) def 是定义函数的关键字。定义函数时,需要注意以下问题: 1,不需要说…...