Python调用yt-dlp获文件名含换行符致OSError及重命名失败问题
问题解决步骤
核心问题分析
- yt-dlp通过
--print filename输出的内容末尾带有换行符\n,导致文件名无效,触发OSError: [Errno 22]。 - Windows路径字符串未正确处理转义字符,正则表达式误用HTML实体(如
"),导致重命名时路径解析错误,触发WinError 123。
分步修正代码
1. 正确获取并清理文件名
获取yt-dlp输出后,先移除末尾的换行符和空白字符,同时建议将命令拆分为列表形式避免shell解析风险:
from subprocess import run as RUN import os import re # 命令拆分为列表更安全,避免shell注入问题 link = ["yt-dlp", "-f", "399", "https://www.youtube.com/watch?v=vzH3-8_Y7oo", "--print", "filename", "--encoding", "utf-8"] videos = RUN(link, capture_output=True, encoding='utf-8').stdout.strip() # 用strip()移除末尾换行和空白 print(videos)
2. 修正路径和正则表达式
- Windows路径要使用原始字符串(前缀
r)避免转义字符解析错误; - 正则里直接使用实际符号(
"、<、>)替代HTML实体:
# 路径用原始字符串,避免\被解析为转义字符 src_dir = r"D:\Youtube vedio project" def remove_invalid_characters_from_filename(filename): # 正则直接使用Windows禁止的文件名符号,无需HTML实体 invalid_characters = re.compile(r'[\\/:*?"<>|\n]') new_filename = invalid_characters.sub('', filename) return new_filename # 确保原文件名已清理换行 cleaned_old_filename = videos new_filename = remove_invalid_characters_from_filename(cleaned_old_filename) print(new_filename) # 拼接完整路径 old_path = os.path.join(src_dir, cleaned_old_filename) new_path = os.path.join(src_dir, new_filename) # 先检查原文件是否存在,再执行重命名 if os.path.exists(old_path): os.rename(old_path, new_path) else: print(f"原文件不存在:{old_path}")
3. 验证文件打开
使用清理后的文件名即可正常打开文件:
with open(new_path, 'rb') as f: file_content = f.read() print("文件读取成功")
额外注意事项
- 优先将yt-dlp命令拆分为列表形式,避免shell解析带来的额外格式问题;
- 处理文件名时,先用
strip()移除首尾空白和换行,再做特殊字符清理; - Windows系统下文件名禁止包含
\ / : * ? " < > |,正则需覆盖所有这些符号。
内容的提问来源于stack exchange,提问作者Gordon Chao
相关产品推荐
相关产品推荐

