Вы были близки.
Вы должны проиндексировать files
(это список), и тогда каждый элемент списка (files[i]
) будет экземпляром <class 'pathlib.PosixPath'>
, который будет иметь метод .stem
.
for i in range(len(files)):
stem_name = files[i].stem
(test-py38) gino:Q$ cat test.py
from pathlib import Path
base_path = Path(__file__).parent
paths = (base_path / "./files").glob('**/*')
files = [x for x in paths if x.is_file()]
for i in range(len(files)):
stem_name = files[i].stem
print(stem_name)
(test-py38) gino:Q$ ls files
1.txt 2.txt 3.txt
(test-py38) gino:Q$ python test.py
2
3
1
Я не уверен насчет этой ошибки, потому что она не воспроизводится из опубликованного кода:
for i in range(len(files)):
TypeError: object of type 'generator' has no len()
Это можно воспроизвести, только если вы использовали map
для создания files
или использовали выражение генератора (files = (...)
) вместо понимания списка (files = [...]
). В обоих случаях вы будете вызывать len
на генераторе, и это не сработает, потому что генераторы не поддерживают len()
.
(test-py38) gino:Q$ cat test.py
from pathlib import Path
base_path = Path(__file__).parent
paths = (base_path / "./files").glob('**/*')
files = (x for x in paths if x.is_file()) # <---- generator expression
for i in range(len(files)):
stem_name = files[i].stem
print(stem_name)
(test-py38) gino:Q$ python test.py
Traceback (most recent call last):
File "test.py", line 6, in <module>
for i in range(len(files)):
TypeError: object of type 'generator' has no len()
Если вам нужно l oop через генератор , индексирование не использовать.
files = (x for x in paths if x.is_file())
for a_file in files:
stem_name = a_file.stem