Python从多个文件夹中读取多个图像

时间:2017-05-16 13:15:37

标签: python

我想阅读多个.jpg图片,这些图片位于3个单独的文件夹中。 3个文件夹位于同一路径上。我试着这样做:

path1 = os.path.abspath('Type_1')
path2 = os.path.abspath('Type_2')
path3 = os.path.abspath('Type_3')
folder = os.path.join(path1, path2, path3)

def load_images_from_folder(folder):
    images = []
    for filename in os.listdir(folder):
        if filename.endswith(".jpg"):
            img = cv2.imread(os.path.join(folder, filename))
            if img is not None:
                images.append(img)
            return images

print(load_images_from_folder(folder))

但它只返回最后一条路径而不是所有路径。我还尝试使用相对路径,例如:

path1 = os.path.relpath('Type_1')
path2 = os.path.relpath('Type_2')
path3 = os.path.relpath('Type_3')
folder = os.path.join(os.path.sep, path1, path2, path3)

但仍然是同样的问题。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

你的return images行在你的循环中,所以它会在找到任何匹配结果后立即返回。你只希望它在整个循环结束后返回。

减少return语句的缩进,使其在循环之后而不是在其中。

def load_images_from_folder(folder):
    images = []
    for filename in os.listdir(folder):
        if filename.endswith(".jpg"):
            img = cv2.imread(os.path.join(folder, filename))
            if img is not None:
                images.append(img)
    return images

[编辑]

如果你想查看多个相邻的文件夹,你需要这样的东西:

root_folder = '[whatever]/data/train'
folders = [os.path.join(root_folder, x) for x in ('Type_1', 'Type_2', 'Type_3')]
all_images = [img for folder in folders for img in load_images_from_folder(folder)]

这将在每个文件夹上调用load_images,并将所有结果放入一个列表中。

答案 1 :(得分:2)

如果我正确理解了问题,您的文件结构如下所示:

- Type1
    - Image1.jpg
    - Image2.jpg
- Type2
    - Image1.jpg
    - Image2.jpg
- Type3
    - Image1.jpg
    - Image2.jpg

如果这是真的,则os.path.join调用是错误的(它将导致一个字符串,其中显示“Type1 / Type2 / Type3”,这对您没有任何帮助)。

我认为您正在寻找的代码如下:

def load_images_from_folder(folder):
    images = []
    for filename in os.listdir(folder):
        if any([filename.endswith(x) for x in ['.jpeg', '.jpg']]):
            img = cv2.imread(os.path.join(folder, filename))
            if img is not None:
                images.append(img)
    return images

folders = [
    'Type1',
    'Type2',
    'Type3',
]

for folder in folders:
    images = load_images_from_folder(folder)
    # your code that does something with the return images goes here

答案 2 :(得分:0)

我知道这真的很旧,但最近对我有用。

 def create_dataset(img_folder):
    img_data_array=[]
    class_name=[]

    for dirl in os.listdir(img_folder):
        for file in os.listdir(os.path.join(img_folder,dirl)):
        
            if any([file.endswith(x) for x in ['.jpeg', '.jpg']]):
            

                 image_path=os.path.join(img_folder,dirl,file)
                 image=cv2.imread(image_path,cv2.COLOR_BGR2RGB)
             
                 img_data_array.append(image)
                 class_name.append(dirl)
    return img_data_array,class_name


img_data, class_name =create_dataset(train_folder)