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

使用os.path生成路径时,无法通过with open创建二进制文件

Windows环境下写入Vimeo视频分段文件触发[Errno 22]无效参数错误

使用修改过请求会话的hidden-vimeo-downloader代码下载Vimeo视频时,本地Windows环境在写入二进制文件环节报错,GitHub Codespaces中运行正常。代码已提前创建目标目录,尝试多种文件打开模式(wb/wb+/w+b)均失败,拆分路径变量、转义字符、使用原始字符串等操作也无效。

相关代码片段

r = requests.get(current_segement_url)
v_seg_file = os.path.join(out_video ,"video-" + segment_base_name + str(i) + segment_base_ext)

# 打印路径变量内容
print(v_seg_file)

with open(v_seg_file, "wb") as f:
    f.write(r.content)

终端报错输出

segments_video_8cf150a5-2ce1-4adc-bb37-111111111111\video-segment-0.m4s?r=11111111dHJhbDE%3D
Traceback (most recent call last):
File "C:\Users\XXXXX\.......\hidden-vimeo-downloader\vimeo-downloader.py", line 78, in <module>
with open(v_seg_file, "wb") as f:
         ^^^^^^^^^^^^^^^^^^^^^^
OSError: [Errno 22] Invalid argument: 'segments_video_8cf150a5-2ce1-4adc-bb37-111111111111\\video-segment-0.m4s?r=11111111dHJhbDE%3D'   

问题原因

终端里显示的双反斜杠只是Python字符串的转义表示,实际路径中的反斜杠是正常的。真正的问题是Windows系统不允许文件名包含?等特殊字符,而你的文件名里带有?r=11111111dHJhbDE%3D这个URL查询参数部分,这在Windows下是非法的文件名格式。

解决方案

需要从segment_base_ext中剥离URL查询参数,只保留文件扩展名部分。可以用两种方式处理:

  • 直接按问号分割字符串,取前面的部分:
    # 处理segment_base_ext,去掉问号及后面的内容
    clean_ext = segment_base_ext.split('?')[0]
    v_seg_file = os.path.join(out_video ,"video-" + segment_base_name + str(i) + clean_ext)
    
  • 使用urllib.parse解析URL部分(如果segment_base_ext是从URL中提取的):
    from urllib.parse import urlparse
    parsed = urlparse(segment_base_ext)
    clean_ext = parsed.path  # 只保留路径部分,去掉查询参数
    v_seg_file = os.path.join(out_video ,"video-" + segment_base_name + str(i) + clean_ext)
    

内容的提问来源于stack exchange,提问作者Matteemol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 07:40:13