如果我运行以下代码:
\n\nfrom pathlib import Path\npath = Path(\'data/mnist\')\npath.ls()\nRun Code Online (Sandbox Code Playgroud)\n\n我收到以下错误:
\n\nAttributeError: \xe2\x80\x98PosixPath\xe2\x80\x99 object has no attribute \xe2\x80\x98ls\xe2\x80\x99\nRun Code Online (Sandbox Code Playgroud)\n\n查看pathlib中的Path类,我发现:
\n\ndef __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\nRun Code Online (Sandbox Code Playgroud)\n\n我猜这意味着它将运行 PosixPath,即:
\n\nclass 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__ = ()\nRun Code Online (Sandbox Code Playgroud)\n\n不太确定这意味着什么。
\n\n实际上,我在 pathlib 源代码中根本找不到 Path.ls() 。这有道理吗?我正在遵循的编码教程使用了它(在 Windows 机器上)。
\n如果阅读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)
| 归档时间: |
|
| 查看次数: |
7376 次 |
| 最近记录: |