如何使用 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
内置库来获得所需的结果,对于您拥有的每个文件
- 获取保存时间戳的子字符串
- 使用
datetime.datetime.strptime
将其解析为datetime.datetime
实例
- 使用
.timestamp
方法 将所述实例转换为纪元以来的秒数
- 计算整数除法秒数(
//
)10800
(3hr 内的秒数)
- 将您得到的值转换为
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
我有一个如下所示的图像数据集: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
内置库来获得所需的结果,对于您拥有的每个文件
- 获取保存时间戳的子字符串
- 使用
datetime.datetime.strptime
将其解析为 - 使用
.timestamp
方法 将所述实例转换为纪元以来的秒数
- 计算整数除法秒数(
//
)10800
(3hr 内的秒数) - 将您得到的值转换为
str
并将其用作目标子文件夹名称
datetime.datetime
实例
既然你说你只需要 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