我试图运行的代码是:
import numpy as np
import os
import cv2
import matplotlib.pyplot as plt
from os import listdir
from pathlib import Path
all_images = list(Path(r'D:/face/train').glob('**/*.jpg'))
np.array([np.array(cv2.imread(str(file))).flatten() for file in all_images])
Path = r'D:\face\train'
print(all_images[0])
输出为:D:\ face \ train \ F0002 \ MID1 \ P00009_face3.jpg
train_images = ([x for x in all_images if val_families not in x])
val_images = ([x for x in all_images if val_families in x])
我遇到以下错误。
TypeError Traceback (most recent call last)
<ipython-input-8-8de97a2e12c1> in <module>
----> 1 train_images = ([x for x in all_images if val_families not in x])
2 val_images = ([x for x in all_images if val_families in x])
<ipython-input-8-8de97a2e12c1> in <listcomp>(.0)
----> 1 train_images = ([x for x in all_images if val_families not in x])
2 val_images = ([x for x in all_images if val_families in x])
TypeError: argument of type 'WindowsPath' is not iterable
首先我没有使用Path类,而是使用了以下命令
all_images = glob(train_folders_path + "*/*/*.jpg")
print(all_images[0])
但是在这里我遇到了索引错误。后来我导入Path并尝试了第一个代码,该代码给了我想要的输出。 但是我在下一行中提到了错误。 请帮我解决这个问题。
答案 0 :(得分:0)
我在这里出现索引错误。
glob
返回一个生成器,而不是一个容器。
您可以遍历glob的结果,
但是你只能做一次
并且您无法通过下标获得初始结果。
如果您想多次使用结果,
或使用[0]
选择第一个,
然后使用list( ... )
作为您的第一个代码示例。
这将遍历结果并将其存储在list
中
您可以重复使用或索引心脏内容的容器。
或者,您可以使用next( ... )
来访问
初步结果,但这似乎并不是您想要的。
编辑
这个WindowsPath不是可迭代的意味着什么?
从list
获得的glob
有几个元素,
这些元素都是路径。
您无法遍历Path
,
就像您无法遍历int
一样。
当然,您可以自由地在list
个Path
中进行迭代,
或超过list
个int
中的一个。
您可以将Path
变成str
并对其进行迭代,
如下例所示,但这不是您想要的。
通常,您会想open(path, 'r')
并进行迭代
在 that 上,它将从文本文件中生成行,
一次一行。
>>> from pathlib import Path
>>>
>>> path = Path('foo')
>>> path
PosixPath('foo')
>>>
>>> for x in path:
... print(x)
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'PosixPath' object is not iterable
>>>
>>> for x in str(path):
... print(x)
...
f
o
o
>>>