Python:无法使用os.path生成的路径创建二进制文件(单个反斜杠作为双反斜杠传递?)

0 投票
4 回答
91 浏览
提问于 2025-04-12 20:43

我正在尝试从Vimeo下载一个视频(使用这个代码 https://github.com/moettle/hidden-vimeo-downloader,并对请求会话信息做了一些修改),在写文件的部分,我遇到了一个[Errno 22]的错误,就好像with open(PATH, "wb")把反斜杠当成了双反斜杠。

比如说,如果PATH是“folder\filename.txt”,终端的输出显示:

OSError: [Errno 22] Invalid argument: 'folder\filename.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创建没有问题,里面只有一行文本“file written”。)

这可能是二进制写入的一个平台问题吗?我在本地的Windows机器上运行这个代码,但昨天我在Github Codespaces上运行(用另一个视频网址),结果很好。

4 个回答

-1

使用原始字符串。

举个例子:

file path = r".\your-path"

在你的目录前面加个'r'。

0

确保你的路径使用原始字符串(rpath),或者把反斜杠换成正斜杠(folder/filename.txt)。在Python中,反斜杠是转义字符,常常会在文件路径中引发像你遇到的问题。此外,检查一下你的路径和文件名,看看有没有不支持的字符,因为这些字符可能会导致Errno 22错误。如果修改路径后问题依旧,可以手动打印出来,确认一下路径是否正确,或者有没有隐藏的字符。

0

很可能,codespaces 是在运行 Linux 系统,这就是为什么在那里的文件创建可以成功。Windows 和 *nix 系统在文件名中允许使用的字符规则是不同的。

想了解更多具体信息,可以参考 这个 StackOverflow 的回答

由于你在使用 Windows,很多字符是不能用的,特别是对于你的情况,问号就是一个不允许的字符。文件是二进制还是文本格式在这里并没有影响。

解决方法:

在尝试在 Windows 上创建文件之前,你需要先清理文件名。

小提示: Python 的 str.translate 方法非常有用,可以在字符串中进行多次替换。

撰写回答