用shutil.copy 代替os.system(‘copy ...‘)

今天写代码运行的时候出现了一个问题,写文章记录一下最终处理方法

复制命令:在 Windows 上使用 os.system('copy ...') 可能会导致一些问题。使用 shutil.copy 来代替

import shutil
...
shutil.copy(audio_file, output_file)

路径拼接:建议使用 os.path.join 来构造文件路径,这样可以确保路径在不同操作系统上的兼容性。

audio_file = os.path.join(output_folder, f"line_{index}.wav")
output_file = os.path.join(unprocessed_folder, f"line_{index}.wav")

调试信息:在未复制的情况下,打印出实际要复制的文件路径和目标路径,以确保路径的正确性。

print(f"Copying from {audio_file} to {output_file}")

原始代码中使用 os.system('copy ...') 可能导致未能复制未处理音频文件的原因包括:

  1. 命令格式问题:在 Windows 系统中,os.system 直接执行的是命令行命令,任何格式错误(例如,路径中包含空格而未用引号括起来)都会导致命令失败。

  2. 路径问题:如果 audio_fileunprocessed_folder 的路径不正确,copy 命令也会失败。使用 shutil.copy 时,它会直接处理文件路径,并在内部管理这些细节。

  3. 错误反馈os.system 只返回命令的执行状态,但不显示任何详细错误信息,导致你可能无法看到具体的失败原因。而使用 shutil.copy 可以直接捕获异常,从而知道是什么导致了失败。

  4. 环境问题:在某些情况下,系统环境变量或用户权限可能影响命令的执行。使用 Python 内置的库(如 shutil)可以减少这种依赖,使代码更加健壮。

通过使用 shutil.copy,避免了这些潜在的问题,因为它更好地处理了路径、错误和平台兼容性,确保了音频文件能够正确复制到目标文件夹。


我的需求如下:

读取updated_ch.txt,比较两个值大小

如果值4>2,处理音频变速,处理后的音频保存到processed_wav_files文件夹下

否则,直接将对应音频复制到unprocessed_wav_files文件夹下

原始代码最终运行结果没有达到我的预期,出现了一个问题,unprocessed_wav_files文件夹是空的,其他结果都正常。

最后调整了代码。

# 原始代码
import os  
import re  
import ffmpeg  

# 文件配置
updated_ch_file = 'updated_ch.txt'  # 要读取的文本文件
output_folder = 'output_wav_files'  # 存放音频文件的文件夹
processed_folder = 'processed_wav_files'  # 存放处理后的音频文件的文件夹
unprocessed_folder = 'unprocessed_wav_files'  # 存放未处理的音频文件的文件夹

# 创建输出文件夹
os.makedirs(processed_folder, exist_ok=True)  # 如果处理后的文件夹不存在,则创建它
os.makedirs(unprocessed_folder, exist_ok=True)  # 如果未处理的文件夹不存在,则创建它

# 提取第二个和第四个数值的函数
def extract_values(line):
   
    match = re.search(r'(\d+): \[(\d+), (\d+), .*?, (\d+)\]', line)
    if match:  # 如果匹配成功
        first_value = int(match.group(1))
        second_value = int(match.group(3))   # 提取第二个数值并转换为整数
        fourth_value = int(match.group(4))   # 提取第四个数值并转换为整数
        return first_value,second_value, fourth_value  # 返回提取的数值
    return None, None, None  

# 处理音频文件的函数
def process_audio(index, second_value, fourth_value):
    # 构造对应的音频文件名
    audio_file = f"{output_folder}/line_{index}.wav"
    
    if os.path.exists(audio_file):  # 检查音频文件是否存在
        if fourth_value > second_value:  # 如果第四个数值大于第二个数值
            # 使用 FFmpeg 进行音频变速处理
            output_file = f"{processed_folder}/line_{index}.wav"  # 处理后音频文件的路径
            speed_factor = fourth_value / second_value  # 计算变速因子
            try:
                # 调用 FFmpeg 进行音频处理
                ffmpeg.input(audio_file).filter('atempo', speed_factor).output(output_file).run(overwrite_output=True)
                print(f"Processed: {audio_file} to {output_file} with speed factor {speed_factor:.2f}")
            except ffmpeg.Error as e:  # 如果处理过程中出现错误
                print(f"Error processing {audio_file}: {e}")  # 输出错误信息
        else:  # 如果第四个数值不大于第二个数值
            # 直接复制未处理的音频到 unprocessed 文件夹
            output_file = f"{unprocessed_folder}/line_{index}.wav"
            os.system(f'copy "{audio_file}" "{unprocessed_folder}"')  # 使用系统命令复制文件
            print(f"Unprocessed: {audio_file} copied to {unprocessed_folder}")
    else:
        print(f"File not found: {audio_file}")  # 如果音频文件不存在,输出提示信息


# 主程序入口
if __name__ == "__main__":
    # 读取 updated_ch.txt 文件
    with open(updated_ch_file, 'r', encoding='utf-8') as f:
        lines = f.readlines()  # 读取所有行并存储在列表中

    # 遍历每一行,使用 enumerate 获取索引和行内容
    for index, line in enumerate(lines, start=1):
        first_value, second_value, fourth_value = extract_values(line)  # 提取第二个和第四个数值

        if second_value is not None and fourth_value is not None:  # 如果成功提取到数值
            print(f"第{first_value}行,第二个数值: {second_value}, 第四个数值: {fourth_value}")  # 输出提取的数值
            process_audio(index, second_value, fourth_value)  # 处理对应的音频文件

以下代码运行结果能实现预期结果

# 修改后
import os  
import re  
import ffmpeg  
import shutil  # 引入 shutil 用于复制文件

# 文件配置
updated_ch_file = 'updated_ch.txt'  # 要读取的文本文件
output_folder = 'output_wav_files'  # 存放音频文件的文件夹
processed_folder = 'processed_wav_files'  # 存放处理后的音频文件的文件夹
unprocessed_folder = 'unprocessed_wav_files'  # 存放未处理的音频文件的文件夹

# 创建输出文件夹
os.makedirs(processed_folder, exist_ok=True)  # 如果处理后的文件夹不存在,则创建它
os.makedirs(unprocessed_folder, exist_ok=True)

# 提取第二个和第四个数值的函数
def extract_values(line):
    match = re.search(r'(\d+): \[(\d+), (\d+), .*?, (\d+)\]', line)
    if match:
        first_value = int(match.group(1))
        second_value = int(match.group(3))
        fourth_value = int(match.group(4))
        return first_value, second_value, fourth_value
    return None, None, None  

# 处理音频文件的函数
def process_audio(index, second_value, fourth_value):
    # 构造对应的音频文件名
    audio_file = os.path.join(output_folder, f"line_{index}.wav")
    
    if os.path.exists(audio_file):
        if fourth_value > second_value:
            # 使用 FFmpeg 进行音频变速处理
            output_file = os.path.join(processed_folder, f"line_{index}.wav")
            speed_factor = fourth_value / second_value
            try:
                # 调用 FFmpeg 进行音频处理
                ffmpeg.input(audio_file).filter('atempo', speed_factor).output(output_file).run(overwrite_output=True)
                print(f"Processed: {audio_file} to {output_file} with speed factor {speed_factor:.2f}")
            except ffmpeg.Error as e:
                print(f"Error processing {audio_file}: {e}")
        else:
            # 直接复制未处理的音频到 unprocessed 文件夹
            output_file = os.path.join(unprocessed_folder, f"line_{index}.wav")
            shutil.copy(audio_file, output_file)  # 使用 shutil.copy
            print(f"Unprocessed: {audio_file} copied to {unprocessed_folder}")
    else:
        print(f"File not found: {audio_file}")

if __name__ == "__main__":
    with open(updated_ch_file, 'r', encoding='utf-8') as f:
        lines = f.readlines()

    # 遍历每一行,使用 enumerate 获取索引和行内容
    for index, line in enumerate(lines, start=1):
        first_value, second_value, fourth_value = extract_values(line)
        if second_value is not None and fourth_value is not None:
            print(f"第{first_value}行,第二个数值: {second_value}, 第四个数值: {fourth_value}")
            process_audio(index, second_value, fourth_value)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/905841.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

谷歌插件开发学习指南

什么是谷歌插件 谷歌插件(Chrome Extension)是为谷歌浏览器(Chrome)开发的小程序,旨在增强浏览器的功能或用户体验。它们可以通过添加工具栏按钮、修改网页内容、集成其他服务等方式,实现各种功能&#xf…

linux命令行的艺术

文章目录 前言基础日常使用文件及数据处理系统调试单行脚本冷门但有用仅限 OS X 系统仅限 Windows 系统在 Windows 下获取 Unix 工具实用 Windows 命令行工具Cygwin 技巧 更多资源免责声明 熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际…

Puppeteer 与浏览器版本兼容性:自动化测试的最佳实践

Puppeteer 支持的浏览器版本映射:从 v20.0.0 到 v23.6.0 自 Puppeteer v20.0.0 起,这个强大的自动化库开始支持与 Chrome 浏览器的无头模式和有头模式共享相同代码路径,为自动化测试带来了更多便利。从 v23.0.0 开始,Puppeteer 进…

知识管理新选择!本地大模型助手“知我AI”全功能解析

抖知书老师推荐: 随着人工智能技术的飞速发展,本地大模型知识管理工具逐渐成为提高工作效率的利器。今天,我要向大家介绍一款名为**“知我AI”**的本地知识管理助手,它以其独特的功能和优势,正在成为众多专业人士的新…

Banana Pi BPI-R3路由器开发板运行 OrayOS物联网系统

近日,Banana PI开发板宣布与贝锐达成战略合作,贝锐OrayOS现已成功适配Banana PI的BPI-R3型号,并计划进一步扩展硬件支持,包括目前Banana PI热销的BPI-R4、BPI-R3 Mini等更多型号。这一合作为用户提供了更广泛的开发板选择&#xf…

No.24 笔记 | WEB安全 - 任意文件包含漏洞 part 6

在 Web 安全领域中,任意文件包含漏洞是一种较为常见且具有潜在危险性的漏洞类型。本文将详细介绍任意文件包含漏洞的概念、原理、分类、利用方法以及防护措施,帮助新手小白更好地理解和防范这一漏洞。😃 一、概念 包含的定义 开发人员为了提…

森利威尔SL2516D 耐压60V内置5V功率MOS 支持PWM LED恒流驱动器芯片

一、基本特性 型号:SL2516D封装:ESOP8工作频率:140kHz驱动MOS管:内置 二、电气特性 输入电压范围:8V~100V(注意,虽然问题中提到耐压60V,但根据官方信息,其实际耐压范围…

Vscode配置CC++编程环境的使用体验优化和补充说明

文章目录 快速编译运行👺code runner插件方案Code Runner Configuration 直接配置 相关指令和快捷键默认task配置和取消默认 配置文件补充介绍(可选 推荐阅读)😊使用vscode预置变量和环境变量环境变量的使用使用环境变量的好处环境变量可能引起的问题 检…

Linux中rpm包和yum仓库介绍及入门配置

rpm包概述 RPM Package Manager,RPM包管理器 由红帽公司提出,适用于Rocky Linux、Redhat、SUSE等系列操作系统 建立集中数据库,记录软件包安装/卸载等变化信息,分析软件包依赖关系 RPM包 文件名特征 软件名-版本信息.操作系统.硬件架/构.r…

L 波段射频信号采集回放系统

L 波段采集回放系统是一套便携式模拟数字采集系统,该系统主要由射频输入模块、中频接收回放模块、FPGA 信号处理单元、服务器系统和存储单元等组成。 L 波段采集回放系统的功能主要用于对 950MHz〜2150MHz 模拟量射频信号的采集、存储记录与回放;采集与…

百度如何打造AI原生研发新范式?

👉点击即可下载《百度AI原生研发新范式实践》资料 2024年10月23-25日,2024 NJSD技术盛典暨第十届NJSD软件开发者大会、第八届IAS互联网架构大会在南京召开。本届大会邀请了工业界和学术界的专家,优秀的工程师和产品经理,以及其它行…

Unity3D 开发教程:从入门到精通

Unity3D 开发教程:从入门到精通 Unity3D 是一款强大的跨平台游戏引擎,广泛应用于游戏开发、虚拟现实、增强现实等领域。本文将详细介绍 Unity3D 的基本概念、开发流程以及一些高级技巧,帮助你从零基础到掌握 Unity3D 开发。 目录 Unity3D…

Vue3和Springboot前后端简单部署

一、Vue3Springboot 的前后端简单部署 (在win下面部署) 1、前端实现部署 思想: 前端打包项目后、放到nginx中进行部署 1、nginx 安装 和 解压 1、下载 nginx.zip win版本 解压就可以 2、解压后、启动程序 3、访问 nginx 欢迎页面 http://localhost/ 80 端口 可以省略 直接访…

中仕公考:2025四川省考今日报名!

2025年四川省考今日开始报名啦!准备参加考试的广大考生们不要错过报名时间哦! 报名时间: 2024年11月1日至7日上午8:00 资格审查: 2024年11月1日至8日上午8:00 确认缴费: 2024年11月9日上午8:00 准考证打印&#xff…

css 同时实现渐变色和文字阴影(Vue 3 + TypeScript)

UI效果 渐变效果 直接添加text-shadow属性&#xff0c;发现阴影覆盖在了字体之上 解决&#xff1a; 利用::after伪类&#xff0c;将字体的阴影加在伪类之上。 <template><div class"app"><h1 ref"h1Ref">{{ title }}</h1></d…

从美颜SDK到实时视频美颜平台:开发美颜系统的技术解析

今天&#xff0c;笔者将围绕美颜SDK的基本功能、实时视频美颜平台的架构设计&#xff0c;以及实现美颜系统的关键技术进行深入解析。 一、美颜SDK的基础功能 美颜SDK&#xff08;Software Development Kit&#xff09;是实现美颜效果的核心工具包&#xff0c;它通常包含一系列…

【Linux】用户权限管理:创建受限用户并配置特定目录访问权限

本文详细介绍了如何在 Linux 系统中创建一个名为 agent 的新用户&#xff0c;并限制其在特定目录下的权限。通过使用 useradd 命令创建用户&#xff0c;并使用 usermod 命令将新用户添加到现有用户组中&#xff0c;确保其具有适当的权限。接着&#xff0c;通过 chown 和 chmod …

获英伟达二次投资!AI制药公司Terray完成1.2亿美元融资,构建全球最大化学数据集

近日&#xff0c;AI 制药公司 Terray Therapeutics 宣布完成 1.2 亿美元 B 轮融资&#xff0c;本轮融资将用于推进其内部免疫学项目的临床试验&#xff0c;并进一步完善公司的生成式 AI 平台 tNova。 据悉&#xff0c;本次 Terray 的融资由英伟达风险投资部门 NVentures 和新投…

LeetCode 热题 100之二叉树

1.二叉树的中序遍历 思路分析1&#xff08;递归&#xff09;&#xff1a;通过一个辅助函数 inorderHelper&#xff0c;递归地访问左子树、根节点和右子树&#xff0c;实现中序遍历。 具体实现代码&#xff08;详解版&#xff09;&#xff1a; class Solution { public:void i…

LLC电路 - 变压器匝比改变时的连锁反应

1.谐振电路等效电阻Rac 等效电阻从负载一侧映射过来&#xff0c;假定负载电阻为R&#xff0c;功率计算公式为U_out^2/R&#xff0c;则理想变压器因为Uin N*Uout&#xff0c;所以等效电阻的阻值变化是平方关系&#xff1a;Rref K*R*N^2.具体的计算公式为&#xff1a; Vp为变压…