python 将大量数据排序到单独的集合中

swvgeqrz  于 2023-01-29  发布在  Python
关注(0)|答案(2)|浏览(107)

每次实验我提取多达2500帧文件(数量不一定相同),目前我的过程是手动将帧总数除以3,分成三个子集文件夹,因为文件太大,无法将所有文件转换为.mat文件。
一旦文件被分为三个子集(“Subset1,Subset2,Subset3”),我运行我的代码转换和重命名每个文件夹。

from scipy.io import savemat
import numpy as np
import os
arrays = []
directory = r"F:\...\Experiment 24\Imaging\Subset3" # **something here that will look at the while directory and create a different file for each subset folder**
sorted(os.listdir(directory))
for filename in sorted(os.listdir(directory)):
    f = os.path.join(directory, filename)
    arrays.append(np.load(f))
data = np.array(arrays)
data = data.astype('uint16')

data = np.moveaxis(data, [0, 1, 2], [2, 1, 0])

savemat('24_subset3.mat', {'data': data})

如何自动将帧文件分类到三个单独的子集文件夹中并进行转换?

qxsslcnc

qxsslcnc1#

从文件名创建子集并将其复制到新的子集目录:

num_subsets = 3
in_dir = "/some/path/to/input"
out_dir = "/some/path/to/output/subsets"

filenames = sorted(os.listdir(in_dir))
chunk_size = len(filenames) // num_subsets

for i in range(num_subsets):
    subset = filenames[i * chunk_size : (i + 1) * chunk_size]

    # Create subset output directory.
    subset_dir = f"{out_dir}/subset_{i}"
    os.makedirs(subset_dir, exist_ok=True)

    for filename in subset:
        shutil.copyfile(filename, f"{subset_dir}/{filename}")

注:将跳过任何无法分配到相等子集中的额外文件。

at0kjp5o

at0kjp5o2#

如果您的目标只是创建三个.mat文件,则根本不需要创建子文件夹和移动文件;你可以在原处迭代它们的子集,你可以手动计算划分子集的索引,但是more_itertools.divide是方便和可读的。
另外,pathlib通常是一种更方便的操作路径和文件名的方式,不用再担心os.path.join了!Path.iterdirPath.glob生成的路径知道它们的位置,并且不需要与其父路径重新组合。

import pathlib

from more_itertools import divided
import numpy as np
from scipy.io import savemat

directory = Path("F:/.../Experiment 24/Imaging/")
subsets = divide(3, sorted(directory.iterdir()))

for index, subset in enumerate(subsets, start=1):
    arrays = [np.load(file) for file in subset]
    data = np.array(arrays).astype('uint16')
    data = np.moveaxis(data, [0, 1, 2], [2, 1, 0])
    savemat(f'24_subset{index}.mat', {'data': data})

相关问题