Python:无法使用 os.path 生成的路径创建带有“with open(xxxxx)”行的二进制文件(单反斜杠作为双斜杠传递?)

问题描述 投票:0回答:1

我正在尝试从vimeo下载视频(使用此代码https://github.com/moettle/hidden-vimeo-downloader,并对请求会话信息进行了一些修改),并在编写部分文件中,我收到一条 [Errno 22] 消息,就好像

with open(PATH, "wb")
将反斜杠读为双反斜杠

即:如果 PATH 类似于“folder ilename.txt”,则终端的输出显示 OSError:[Errno 22]无效参数:“文件夹 ilename.txt”

这是我的代码:

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

# Just to print out the actual variable's content
    print(v_seg_file)

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

(我已经将路径分离到

v_seg_file
,以查看 .encode() 方法或使用替换字符串或原始字符串是否可以工作,但事实并非如此。)

当前输出为:

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'   

(这里修改了实际的文件路径,但是是代码自动生成的)

问题是:为什么我无法创建文件? 上面的一些行,如果目录不存在,则创建该目录。 我也尝试过写“wb”,“wb+”,“w+b”,但没有成功

我认为问题在于

with open(
这里以某种方式将单个反斜杠转换为两个? 我的意思是,
v_seg_file
的打印输出是可以的,它是用
os.path.join
创建的(应该没问题)

我还尝试了另一个脚本来测试此写入语句,就像双重检查一样,它对于非二进制写入效果很好。

import os

out_video = "folder"
segment_base_name = "xxx"
segment_base_ext = "yyy"
i = 0

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

print(v_seg_file)

if not os.path.exists(out_video):
    os.makedirs(out_video)
    print("Directory created successfully!")
else:
    print("Directory already exists!")

with open(v_seg_file, "w") as f:
    f.write("file written")

(结果:文件

folder\video-xxx0yyy
创建时没有任何问题,并且仅包含一行文本“文件已写入”)

这可能是 BINARY 编写的平台问题吗?我在 Windows 机器本地运行此代码,但昨天我在 Github 代码空间(使用另一个视频 URL)运行它并且工作正常。

python binaryfiles file-writing
1个回答
0
投票

使用原始字符串。 例子:

file path = r".\your-path"
© www.soinside.com 2019 - 2024. All rights reserved.