如何使用 python 将大型图像数据集分成图片组并将它们保存在子文件夹中?

How to divide a large image dataset into groups of pictures and save them inside subfolders using python?

我有一个如下所示的图像数据集:Dataset

每个图像的时间步长为 15 分钟(如您所见,时间戳在文件名中)。

现在我想将这些图像分组为 3 小时长的序列,并将这些序列保存在分别包含 12 张图像(=3 小时)的子文件夹中。 理想情况下,结果如下所示: Sequences

我尝试使用 os.walk 并在保存图像数据集的文件夹中循环,然后我使用 pandas 创建了一个数据框,因为我认为我可以更轻松地处理这些文件,但我认为我在这里完全偏离目标。

The timestep of each image is 15 minutes (as you can see, the timestamp is in the filename).

Now I would like to group those images in 3hrs long sequences and save those sequences inside subfolders that would contain respectively 12 images(=3hrs)

我建议利用 datetime 内置库来获得所需的结果,对于您拥有的每个文件

  1. 获取保存时间戳的子字符串
  2. 使用datetime.datetime.strptime
  3. 将其解析为datetime.datetime实例
  4. 使用.timestamp方法
  5. 将所述实例转换为纪元以来的秒数
  6. 计算整数除法秒数(//10800(3hr 内的秒数)
  7. 将您得到的值转换为 str 并将其用作目标子文件夹名称

既然你说你只需要 12 个文件(考虑到所有文件的时间戳都是相同的,而 12 正是你需要的数量,下面的代码可以帮助你

import os
import shutil
output_location = "location where you want to save them" # better not to be in the same location with the dataset
dataset_path = "your data set"
files = [os.path.join(path, file) for path, subdirs, files in os.walk(dataset_path) for file in files]

nr_of_files = 0
folder_name = ""
for index in range(len(files)):
    if nr_of_files == 0:
        folder_name = os.path.join(output_location, files[index].split("\")[-1].split(".")[0])
        os.mkdir(folder_name)
        shutil.copy(files[index], files[index].replace(dataset_path, folder_name))
        nr_of_files += 1
    elif nr_of_files == 11:
        shutil.copy(files[index], files[index].replace(dataset_path, folder_name))
        nr_of_files = 0
    else:
        shutil.copy(files[index], files[index].replace(dataset_path, folder_name))
        nr_of_files += 1

解释代码:
files 获取 dataset_path 中所有文件的值。您设置此变量,files 将包含所有文件的完整路径。

for 循环遍历 files.

的整个长度

nr_of_files统计了每12个文件。如果它是0,它会创建一个名称为files[index]的文件夹到您设置为输出的位置,将复制文件(用输出路径替换输入路径)

如果是11(从0开始,index == 11表示第12个文件)将复制文件并将nr_of_files设置回0以创建另一个文件夹

最后一个 else 将简单地复制文件并递增 nr_of_files