Хотя os.listdir()
подходит для генерации списка имен файлов и каталогов, часто вы хотите делать больше, когда у вас есть эти имена - а в Python3 pathlib упрощает эти другие задачи. Давайте посмотрим, понравится ли вам это так же, как и мне.
Чтобы вывести содержимое каталога, создайте объект Path и возьмите итератор:
In [16]: Path('/etc').iterdir()
Out[16]: <generator object Path.iterdir at 0x110853fc0>
Если мы хотим просто список имен вещей:
In [17]: [x.name for x in Path('/etc').iterdir()]
Out[17]:
['emond.d',
'ntp-restrict.conf',
'periodic',
Если вы хотите только dirs:
In [18]: [x.name for x in Path('/etc').iterdir() if x.is_dir()]
Out[18]:
['emond.d',
'periodic',
'mach_init.d',
Если вам нужны имена всех файлов conf в этом дереве:
In [20]: [x.name for x in Path('/etc').glob('**/*.conf')]
Out[20]:
['ntp-restrict.conf',
'dnsextd.conf',
'syslog.conf',
Если вы хотите список файлов conf в дереве> = 1K:
In [23]: [x.name for x in Path('/etc').glob('**/*.conf') if x.stat().st_size > 1024]
Out[23]:
['dnsextd.conf',
'pf.conf',
'autofs.conf',
Разрешение относительных путей становится легким:
In [32]: Path('../Operational Metrics.md').resolve()
Out[32]: PosixPath('/Users/starver/code/xxxx/Operational Metrics.md')
Навигация по пути довольно ясна (хотя и неожиданна):
In [10]: p = Path('.')
In [11]: core = p / 'web' / 'core'
In [13]: [x for x in core.iterdir() if x.is_file()]
Out[13]:
[PosixPath('web/core/metrics.py'),
PosixPath('web/core/services.py'),
PosixPath('web/core/querysets.py'),