我正在尝试返回特定位置的所有文件和子文件夹的列表。我的代码如下:
from pathlib import Path
FOLDER_PATH = Path(r'C:\long\file\path\of\138\characters\')
我得到了错误:
FileNotFoundError: [WinError 3] The system cannot find the path specified:
该错误发生在文件夹路径上,而不是文件上,因此我不确定是否可能是原因。
当我手动进入文件夹并尝试打开其中的PDF
时,出现“打开此文档时出错。找不到此文件。”
类似地,当我尝试打开XLSX
文件时,出现“无法访问此文件。请尝试以下操作之一:(确保它存在,不是只读的,不是更多的。超过218个字符,等等。”
此文件夹中的文件路径肯定超过218个字符,我知道这可能是Excel的问题,但是我不明白为什么pathlib.Path.rglob
列出它们会出现问题,有人吗?明白吗?
但是,如果我使用CMD
(dir /s /b > files.txt
),则可以获取列表。
另外,如果我随后在python中将files.txt
导入到Path
对象列表paths
中并尝试执行[x.is_file() for x in paths]
,它将无法正确识别其中的一些较长的路径作为文件。
我已验证,如果我在本地复制目录(存在一个较短的路径),则文件可以被Excel和pathlib.Path.rglob
访问。
如何解决此问题,为什么首先要解决这个问题?
答案 0 :(得分:0)
问题是大多数Windows文件系统功能都不接受如下所示的路径:
r'C:\long\file\path\of\256\characters'
因此pathlib和Excel都发现使用这些Windows函数无法打开文件或读取目录。
好消息是Windows函数确实接受如下所示的路径:
r'\\?\C:\long\file\path\of\256\characters'
坏消息是pathlib不能总是正确地加入这种路径:
>>> Path(r'\\?\foo').joinpath(r'\\?\bar')
WindowsPath('//?/foo/bar') # correct
>>> Path(r'\\?\foo', r'\\?\bar')
WindowsPath('//?/bar') # incorrect
>>> Path(r'\\?\c:\foo').joinpath(r'c:\bar')
WindowsPath('c:/bar') # correct, but not the result we want
另一个坏消息是,这样的路径有些受限:当Windows文件系统功能的路径以\\?\
开头时,您不能使用正斜杠或单点或双点。
好消息是,如下所示的函数会将您想出的几乎所有杂乱的路径都转换为有效的东西:
def longname(path):
return pathlib.Path('\\\\?\\' + os.fspath(path.resolve()))
请注意,resolve()
仅在\\?\
实际上存在的情况下才从path
的开头删除path
,因此上面的代码在{{1 }}不存在,已经有path
。因此,请确保您的程序使用不带前缀的“普通”路径,并在执行任何实际文件操作之前最后调用\\?\
,或者增强longname()
:
longname()
Microsoft记录了Windows行为:https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#maximum-path-length-limitation