gpt4 book ai didi

python - pathlib Path.rglob 在 Windows 中的长文件路径上失败

转载 作者:行者123 更新时间:2023-12-01 01:00:40 38 4
gpt4 key购买 nike

我正在尝试返回特定位置中所有文件和子文件夹的列表。我的代码如下:

from pathlib import Path
FOLDER_PATH = Path(r'C:\long\file\path\of\138\characters\')

我收到错误:FileNotFoundError: [WinError 3] 系统找不到指定的路径:

错误发生在文件夹路径上,而不是文件上,因此我不确定这是否是原因。

当我手动进入该文件夹并尝试打开其中的 PDF 时,我收到“打开此文档时出错。找不到此文件。”

同样,当我尝试打开 XLSX 文件时,我收到“无法访问此文件。请尝试以下操作之一:(确保它存在,不是只读,不是不超过 218 个字符等)”

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

但是,如果我使用 CMD (dir/s/b > files.txt),我就可以获得该列表。

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

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

可以采取哪些措施来解决此问题?为什么这是一个问题?

最佳答案

问题是大多数 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()))

请注意,如果 path 实际上,resolve() 只会从 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://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#maximum-path-length-limitation

关于python - pathlib Path.rglob 在 Windows 中的长文件路径上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55815617/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com