TypeError:“ WindowsPath”类型的参数不可迭代

时间:2019-10-26 15:27:40

标签: python-3.x

我试图运行的代码是:

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并尝试了第一个代码,该代码给了我想要的输出。 但是我在下一行中提到了错误。 请帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

  

我在这里出现索引错误。

glob返回一个生成器,而不是一个容器。 您可以遍历glob的结果, 但是你只能做一次 并且您无法通过下标获得初始结果。

如果您想多次使用结果, 或使用[0]选择第一个, 然后使用list( ... )作为您的第一个代码示例。 这将遍历结果并将其存储在list中 您可以重复使用或索引心脏内容的容器。

或者,您可以使用next( ... )来访问 初步结果,但这似乎并不是您想要的。

编辑

  

这个WindowsPath不是可迭代的意味着什么?

list获得的glob有几个元素, 这些元素都是路径。 您无法遍历Path, 就像您无法遍历int一样。 当然,您可以自由地在listPath中进行迭代, 或超过listint中的一个。

您可以将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
>>>