路径库路径.rglob在Windows中的长文件路径上失败

2024-04-26 22:07:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图返回一个特定位置的所有文件和子文件夹的列表。我的代码如下:

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文件时,我得到“thisfilecouldnetaccess。请尝试下列操作之一:(确保它存在,不是只读的,不超过218个字符,等等)。”

这个文件夹中的文件路径肯定超过218个字符,我知道这对于Excel来说可能是个问题,但是我不明白为什么pathlib.Path.rglob列出它们会有问题,有人明白这一点吗?在

但是,如果我使用CMDdir /s /b > files.txt),我可以得到列表。在

另外,如果我在python中将files.txt导入到Path对象的列表中,并尝试执行[x.is_file() for x in paths],那么它将无法正确地将一些较长的路径标识为文件。在

我已经验证了,如果我在本地复制目录(其中存在一个更短的路径),那么Excel和pathlib.Path.rglob可以访问这些文件。在

我们可以做些什么来解决这个问题,为什么它首先是一个问题?在


Tags: 文件path代码路径txt文件夹列表错误
1条回答
网友
1楼 · 发布于 2024-04-26 22:07:59

问题是,大多数Windows文件系统函数不接受如下路径:

r'C:\long\file\path\of\256\characters'

因此,pathlib和Excel都发现它们无法使用这些Windows函数打开文件或读取目录。在

好消息是,Windows函数确实接受如下路径:

^{pr2}$

坏消息是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开始删除{},因此在path不存在并且已经有{}的情况下,上面的代码就不起作用了。因此,请确保您的程序使用没有前缀的“普通”路径,并在执行任何实际文件操作之前调用longname(),或者增强longname()

def longname(path):
    normalized = os.fspath(path.resolve())
    if not normalized.startswith('\\\\?\\'):
        normalized = '\\\\?\\' + normalized
    return pathlib.Path(normalized)

Microsoft记录了Windows行为:https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#maximum-path-length-limitation

相关问题 更多 >