python - Python:os.path.isfile 没有检测到文件
问题描述
我有一个脚本,它通过检查每个需要的文件是否存在以及如果不存在则下载它们来更新文件层次结构。
因为使用完整路径会导致我认为文件名太长且通常包含特殊字符的问题,所以我已将其更改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)
解决方案
原来这是我最初的怀疑,文件名实际上太长了。
基本文件名不是最长的,但文件名的完整路径(包括根目录的每个子目录)太长。
通过将整个项目移动到根目录来解决该问题。
一个有趣的收获是,您可以在窗口资源管理器中创建文件名过长的文件结构,但如果您甚至尝试简单地使用 python 检测是否有文件,您会遇到问题。
推荐阅读
- php - preg_replace 超过 3 位的所有小数
- flutter - 如何在颤动中强制应用程序进入肖像模式
- javascript - 使用 select2.js 发送 ajax 请求
- java - 无法实例化 [java.util.List]:指定类是 GET 请求中的接口
- angularjs - $q.all() 返回一个未定义值的数组
- c - scanf 跳过数组位置
- webpack - Polyfill 未应用于导入的文件
- mysql - 在 json 数组中使用 JSON_EXTRACT、JSON_SET、JSON_REPLACE、JSON_INSERT
- django - Django中的授权后端
- c++ - 如何在 C++ 中直接使用 addr2line