Python:os.path.isfile没有';无法检测文件
我有一个脚本,通过检查每个需要的文件是否存在来更新文件层次结构,如果不存在,则下载它们 因为使用完整路径会导致文件名出现问题,我认为这些文件名太长并且经常包含特殊字符,所以我将其更改为Python:os.path.isfile没有';无法检测文件,python,windows,file-io,operating-system,Python,Windows,File Io,Operating System,我有一个脚本,通过检查每个需要的文件是否存在来更新文件层次结构,如果不存在,则下载它们 因为使用完整路径会导致文件名出现问题,我认为这些文件名太长并且经常包含特殊字符,所以我将其更改为os.chdir,并将其下载到每个子目录中,检查所需的文件并下载它们 然而,我的程序总是在一个文件上崩溃,因为os.path.isfile出于某种原因说它不存在(即使它存在)。真正让人困惑的是,当它试图以f:的open(路径,“wb”)下载它时,即使它是在写模式下打开的,也会遇到FileNotFoundError
os.chdir
,并将其下载到每个子目录中,检查所需的文件并下载它们
然而,我的程序总是在一个文件上崩溃,因为os.path.isfile
出于某种原因说它不存在(即使它存在)。真正让人困惑的是,当它试图以f:的open(路径,“wb”)下载它时,即使它是在写模式下打开的,也会遇到FileNotFoundError
如果路径链接到一个不存在的目录,但在我的情况下它没有链接到任何目录,那么当您尝试打开时,您似乎可以得到FileNotFoundError
我尝试过在文件名上使用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)
原来这一直是我最初的怀疑,文件名实际上太长了 基本文件名不是最长的,但文件名的完整路径(包括根目录的每个子目录)太长 通过将整个项目移动到根目录,解决了此问题
一个有趣的收获是,您可以在Windows资源管理器中创建文件名过长的文件结构,但如果您甚至尝试使用python简单地检测是否存在文件,您将遇到问题。如果可能,您可以发布代码吗?我尝试解决的另一个技巧是将文件作为“temp”下载然后将其重命名为正确的名称,但我仍然遇到了完全相同的问题。只是检查了文件名是否太长,但其长度为91个字符,并且脚本管理的文件超过110个字符,然后才出现这种情况。在Windows 10上运行的Python 3.6+中,启用了长路径,我们可以使用多达32760个字符的路径,而无需任何额外处理。否则,对于缺少隐式长路径支持的较早版本的Python或Windows,我们必须在完全限定路径前面加上
“\\\\?\\”
。如果它是UNC路径(例如“\\\\server\\share\\file”
),请重写它以使用“UNC”设备(例如“\\\\?\\UNC\server\share\file”
)。另外,对于Python2,我们必须使用unicode
字符串。