使用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
相关产品推荐
相关产品推荐

