播客下载命名异常求助:自定义命名失效,临时文件名可正常运行
问题分析与解决方案
核心问题
你遇到的问题根源是**pod_title中包含文件系统不允许的特殊字符**(比如冒号、斜杠、问号、星号等),直接用它作为文件名会导致路径无效;而tmp.mp3是合法文件名,所以能正常运行。另外你的代码还存在两处语法错误。
修复步骤
1. 修复语法错误
保存wav的代码行存在两处问题:
audio_file_name = s_out_dir + + '/' + pod_title + '.wav
- 多了一个多余的
+号 - 字符串末尾缺少闭合的双引号
修正后改用os.path.join规范拼接:
audio_file_name = os.path.join(s_out_dir, f"{pod_title}.wav")
2. 规范路径拼接
不要用+ '/' +手动拼接路径,统一用os.path.join,它会自动适配Windows/Linux的路径分隔符,避免路径格式错误:
# 替换原来的source_file拼接方式 source_file = os.path.join(s_out_dir, f"{pod_title}.mp3")
3. 清理文件名中的非法字符
写一个工具函数,把pod_title里的非法字符替换成合法字符(比如下划线):
import re def sanitize_filename(filename): # 替换所有文件系统非法字符为下划线 return re.sub(r'[\\/*?:"<>|]', '_', filename)
生成文件名前调用这个函数:
cleaned_title = sanitize_filename(pod_title) source_file = os.path.join(s_out_dir, f"{cleaned_title}.mp3") # wav文件同理 audio_file_name = os.path.join(s_out_dir, f"{cleaned_title}.wav")
完整修正后的代码
import os import re from pydub import AudioSegment import wget def sanitize_filename(filename): return re.sub(r'[\\/*?:"<>|]', '_', filename) # 假设source_dir, pod_label, owner, pod_title, link都是已定义变量 s_out_dir = os.path.join(source_dir, pod_label, owner) # 确保输出目录存在,避免目录未创建报错 os.makedirs(s_out_dir, exist_ok=True) cleaned_title = sanitize_filename(pod_title) source_file = os.path.join(s_out_dir, f"{cleaned_title}.mp3") audio_file_name = wget.download(link, out=source_file) try: sound = AudioSegment.from_mp3(audio_file_name) audio_file_name = os.path.join(s_out_dir, f"{cleaned_title}.wav") sound.export(audio_file_name, format="wav") return audio_file_name except Exception as e: # 打印具体异常信息,方便排查问题 print(f"错误信息: {e}") print(f"失败文件路径: {audio_file_name}")
额外优化
- 添加
os.makedirs(s_out_dir, exist_ok=True)确保输出目录存在,避免因目录未创建导致的报错 - 把
except:改成except Exception as e:,捕获并打印具体异常信息,更容易定位问题
内容的提问来源于stack exchange,提问作者Narayana Bandhi
相关产品推荐
相关产品推荐

