You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python调用yt-dlp获文件名含换行符致OSError及重命名失败问题

问题解决步骤

核心问题分析

  1. yt-dlp通过--print filename输出的内容末尾带有换行符\n,导致文件名无效,触发OSError: [Errno 22]。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 15:16:13