我有一个脚本,通过检查每个所需文件是否存在以及是否下载它们来更新文件层次结构。
因为使用完整路径导致问题,我认为文件名太长并且通常包含特殊字符我已将其更改为os.chdir
到每个子目录中,检查所需文件并下载它们。
但是我的程序一直在一个文件上崩溃,因为os.path.isfile
由于某种原因说它不存在(即使它确实存在)。真正令人困惑的部分是当它试图用with open(path, "wb") as f:
下载并运行到FileNotFoundError
,即使它在写入模式下打开。
当你尝试使用FileNotFoundError
时,你可以获得open
,如果路径链接到一个不存在的目录但在我的情况下它没有链接到任何目录。
我已经尝试在文件名上使用os.path.split
,以防它以某种方式包含斜杠或反斜杠,但文件名似乎没问题。
这是代码。这个问题不在它遇到的第一个目录上,它在遇到这个问题之前至少可以工作十几个。
stepOut = 1
paths = list(map(unquote, url.split("/")[6:]))
for index, path in enumerate(paths):
if index != len(paths) - 1:
if not os.path.isdir(path):
os.mkdir(path)
os.chdir(path)
stepOut += 1
else:
if not os.path.isfile(path):
r = requests.get(url, stream=True)
if r.status_code == 200:
print("Saving", path)
with open(path, 'wb') as f:
r.raw.decode_content = True
shutil.copyfileobj(r.raw, f)
else:
print("Error getting:", url)
else:
print("Skipping", paths)
os.chdir("..\\" * stepOut)
原来这是我原来的怀疑,文件名实际上太长了。
基本文件名不是最长的,但文件名的完整路径包括root的每个子目录太长。
通过将整个项目移动到根目录来解决该问题。
有趣的是,您可以在窗口浏览器中创建文件名太长的文件结构,但如果您甚至尝试使用python来检测文件是否存在,那么您将遇到问题。