Как извлечь основы из нескольких путей к файлам с помощью pathlib? - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь извлечь основу из нескольких путей к файлам, используя pathlib, но не могу этого сделать.

Вот код, который я пробовал:

base_path = Path(__file__).parent
paths = (base_path / "../dictionary/files/").glob('**/*')
files = [x for x in paths if x.is_file()]
for i in range(len(files)):
     stem_name = files.stem[i]

Вот ошибка:

for i in range(len(files)):
TypeError: object of type 'generator' has no len()

У меня есть текстовые файлы с именами 1.txt, 2.txt, 3.txt

Ожидается:

1
2
3

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Вы были близки.

Вы должны проиндексировать 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
1 голос
/ 26 мая 2020
for file_ in files:
    stem = file_.stem
    print(stem)
...