如何从子文件夹中检索图像并将它们存储在另一个单独的文件夹中?

时间:2019-04-06 19:08:33

标签: python

我有一个名为ImageData的图像文件夹,该文件夹具有5000个子文件夹,每个子文件夹包含2-3个图像。我想检索这些图像并将它们存储在一个位置/文件夹中。如何使用python做到这一点。

4 个答案:

答案 0 :(得分:0)

您可以从此处使用解决方案:Recursive sub folder search and return files in a list python获取所有文件的列表。

然后遍历该列表,并使用以下解决方案将每个文件复制到主目录:How to move a file in Python

您最终会得到这样的东西

import glob
import os

# Location with subdirectories
my_path = "Images/"
# Location to move images to
main_dir = "ImagesMain/"

# Get List of all images
files = glob.glob(my_path + '/**/*.jpg', recursive=True)

# For each image
for file in files:
    # Get File name and extension
    filename = os.path.basename(file)
    # Copy the file with os.rename
    os.rename(
        file,
        main_dir + filename
    )

答案 1 :(得分:0)

我不能100%地确定“存储它们”是否能理解您的意思,但是由于我想提供帮助,所以我会假设您要将它们复制到其他路径来继续前进。特别是,如果我正确理解了您的文件夹结构,例如以下:

├── ImageData
│   ├── dir_1
│   │   ├── img_1
│   │   ├── img_2
│   ├── dir_2
│   │   ├── img_1
│   │   ├── img_2

等等,您不必关心保存子目录的名称,而只是想将所有这些图像移动到一个没有子结构的唯一目录中。

如果我的假设是正确的,那么我想到的解决方案可能是:

import glob 
import shutil


destination_path = "/path/to/your/oneplace_folder/"
pattern = "/path/to/your/ImageData/*/*"  
for img in glob.glob(pattern):
    shutil.copy(img, destination_path)

两个通配符分别用于ImageData下的子目录和其中的图像。另外,如果图像包含要在复制它们时保留的元数据,则可能要使用documentation

中指定的copy2()

答案 2 :(得分:0)

另一个可能的解决方案:

import os
import cv2

directory = 'ImageData'
new_directory = 'NewImageData'

# If dir does not exist otherwise delete next line
os.mkdir(new_directory)

def copy_images():
    for file_name in os.listdir(directory):
        sub_dir_path = directory + '/' + file_name
        if (os.path.isdir(sub_dir_path)):
            for image_name in os.listdir(sub_dir_path):
                if image_name[-4:] == '.jpg':
                    img = cv2.imread(image_name)
                    copied_image_path = new_directory + '/' + image_name
                    cv2.imwrite(copied_image_path, img)

copy_images()

此代码将复制图像并将其保存到新创建的目标目录中。它不保留子文件夹层次结构。

答案 3 :(得分:0)

对上述答案稍作改动:由于有时可能存在同名文件,因此检查很重要。

import glob
import os
import shutil

# Location with subdirectories
my_path = "Source/"
# Location to move images to
main_dir = "Dest/"

# Get List of all images
files = glob.glob(my_path + '/**/*.jpg', recursive=True)

# For each image
for file in files:
    # Get File name and extension
    filename = os.path.basename(file)
    filename=filename[:-4].replace(".", "-") + ".jpg"
    #print(filename)
    # Copy the file with os.rename
    if not os.path.exists(os.path.join(main_dir, filename)):
        os.rename(file, os.path.join(main_dir, filename))