如何使用 pathlib 从多个文件路径中提取词干?



我正在尝试使用 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.txt2.txt3.txt

预期:

1
2
3

你很接近。

你应该索引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()

如果需要遍历生成器,请不要使用索引。

files = (x for x in paths if x.is_file())
for a_file in files:
stem_name = a_file.stem
for file_ in files:
stem = file_.stem
print(stem)

最新更新