Python:无法使用os.path生成的路径创建二进制文件(单个反斜杠作为双反斜杠传递?)
我正在尝试从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 个回答
使用原始字符串。
举个例子:
file path = r".\your-path"
在你的目录前面加个'r'。
确保你的路径使用原始字符串(rpath
),或者把反斜杠换成正斜杠(folder/filename.txt
)。在Python中,反斜杠是转义字符,常常会在文件路径中引发像你遇到的问题。此外,检查一下你的路径和文件名,看看有没有不支持的字符,因为这些字符可能会导致Errno 22
错误。如果修改路径后问题依旧,可以手动打印出来,确认一下路径是否正确,或者有没有隐藏的字符。
很可能,codespaces 是在运行 Linux 系统,这就是为什么在那里的文件创建可以成功。Windows 和 *nix 系统在文件名中允许使用的字符规则是不同的。
想了解更多具体信息,可以参考 这个 StackOverflow 的回答。
由于你在使用 Windows,很多字符是不能用的,特别是对于你的情况,问号就是一个不允许的字符。文件是二进制还是文本格式在这里并没有影响。
解决方法:
在尝试在 Windows 上创建文件之前,你需要先清理文件名。
小提示:
Python 的 str.translate
方法非常有用,可以在字符串中进行多次替换。