我有一个包含许多子文件夹的根目录,每个子文件夹都包含图像。我想将它们全部加载到一个数组中,并为每个图像分配其子文件夹名称。现在我知道如何将所有图像加载到一个形状的数组中,例如(10 000, 512, 512, 3)
,表示10 000
尺寸为512x512
且3
个频道的图像。在分配子文件夹名称之后,我想要一个类似的数组,但我可以说一下10 000个子文件夹中的每一个。
我正在尝试使用os.walk
。我知道如何访问所有子文件夹名称和图像名称,但我无法弄清楚如何将它们放在一个数组中。
import os
from scipy.misc import imread
images = []
for root, dirs, files in os.walk('.'):
for name in dirs:
print(name)
for file in files:
img = imread(os.path.join(root, file), mode='RGB')
if img is not None:
images.append(img)
(如果数组不包含完整的子文件夹名称字符串,但只包含数字(类/子文件夹),那就太棒了。我不确定这是否可以在此加载过程中完成或者它' d在加载所有图像后完成。)
答案 0 :(得分:0)
这样的事情怎么样?
import glob
import os
from scipy.misc import imread
images = {}
for file in glob.glob("./**/*.png", recursive=True):
cwd = os.path.basename(os.path.dirname(file))
img = imread(os.path.abspath(file), mode='RGB')
if img is not None:
if cwd not in images.keys():
images[cwd] = {}
images[cwd][file] = img
else:
images[cwd][file] = img
for key in images.keys():
print("{:10s}{}".format(key, list(images[key].keys())))
这是一个示例目录结构:
.
├── f_one
│ └── one.png
├── f_two
│ ├── f_nested
│ │ └── nest.png
│ ├── three.png
│ └── two.png
├── out.txt
└── test.py
3 directories, 6 files
以及输出:(由于数组非常大,我没有包含图像数据)
f_two ['./f_two/three.png', './f_two/two.png']
f_nested ['./f_two/f_nested/nest.png']
f_one ['./f_one/one.png']
如果您只使用print(images)
代替最后一个循环,那么您将获得以下内容:
{'f_two': {'./f_two/three.png': array([[[255, 255, 255],
[255, 255, 255],
[255, 255, 255],
...,
有关此解决方案的一些注意事项:
使用词典意味着键必须是唯一的。如果您有任何具有相同名称的文件夹,则最后一个要读取的文件夹将是dict中唯一存在的文件夹。同一目录中的重复文件名也是如此。如果您具有非唯一的目录或文件名,请尝试使用其他数据结构,或使用绝对路径确保键是唯一的。