在Google Colab中使用pathlib:AttributeError:'PosixPath'对象没有属性'ls'

Jac*_*eau 5 python pathlib

如果我运行以下代码:

\n\n
from pathlib import Path\npath = Path(\'data/mnist\')\npath.ls()\n
Run Code Online (Sandbox Code Playgroud)\n\n

我收到以下错误:

\n\n
AttributeError: \xe2\x80\x98PosixPath\xe2\x80\x99 object has no attribute \xe2\x80\x98ls\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n\n

查看pathlib中的Path类,我发现:

\n\n
def __new__(cls, *args, **kwargs):\n        if cls is Path:\n            cls = WindowsPath if os.name == \'nt\' else PosixPath\n        self = cls._from_parts(args, init=False)\n        if not self._flavour.is_supported:\n            raise NotImplementedError("cannot instantiate %r on your system"\n                                      % (cls.__name__,))\n        self._init()\n        return self\n
Run Code Online (Sandbox Code Playgroud)\n\n

我猜这意味着它将运行 PosixPath,即:

\n\n
class PosixPath(Path, PurePosixPath):\n    """Path subclass for non-Windows systems.\n\n    On a POSIX system, instantiating a Path should return this object.\n    """\n    __slots__ = ()\n
Run Code Online (Sandbox Code Playgroud)\n\n

不太确定这意味着什么。

\n\n

实际上,我在 pathlib 源代码中根本找不到 Path.ls() 。这有道理吗?我正在遵循的编码教程使用了它(在 Windows 机器上)。

\n

pan*_*ein 4

如果阅读pathlib模块的文档,就可以确认该类确实Path没有 method ls。但是,如果您的目标是列出给定目录中的文件,则可以使用glob如下方法:

from pathlib import Path

DIR = '.'
PATHGLOB = Path(DIR).glob('./*')
LS = [fil for fil in PATHGLOB]
Run Code Online (Sandbox Code Playgroud)

我认为此代码片段与您教程中的代码实现的效果相同。

编辑:

fastai 模块确实实现了ls这样的方法:

Path.ls = lambda x: [o.name for o in x.iterdir()]
Run Code Online (Sandbox Code Playgroud)

*我认为观察到的行为是在教程的 Jupyter 笔记本中导入的结果。这可以通过以下代码片段得到证实:

from fastai import data_block

path = data_block.Path('.')
path.ls()
Run Code Online (Sandbox Code Playgroud)