根据数据框中的信息创建文件夹结构

Create a folder structure based on information from a dataframe

我有这个数据框train_info,其中包含 423 位不同的艺术家和对应于绘画图像的文件名。

    artist             filename
0   Hiroshige          53180.jpg
1   Ivan Aivazovsky    99442.jpg
2   Hiroshige          23508.jpg
3   Hieronymus Bosch   82352.jpg
4   Hiroshige          27254.jpg
... ... ... ... ...
128069  Frans Snyders   14264images161.jpg
128070  Frans Snyders   14260images158.jpg
128071  Frans Snyders   14274images170.jpg
128072  Frans Snyders   14355images90.jpg
128073  Frans Snyders   14270images167.jpg

然后我有一个文件夹 - 绘画 - 包含所有这些图像。

我想做的是创建另一个文件夹 - train - 为每个艺术家创建子文件夹,每个子文件夹应包含与每个艺术家对应的所有图像。

像这样:

-train
    -Hiroshige
         -53180.jpg
         -23508.jpg
         -27254.jpg
         ...
    -Ivan Aivazovsky
         -99442.jpg
         ...
    -Frans Snyders
         -14264images161.jpg
         -14260images158.jpg
         -14274images170.jpg
         -14355images90.jpg
         -14270images167.jpg
         ...

不幸的是,我不知道如何解决这个问题。

一种简单、省力的方法是使用显式循环:

import os
import shutil

srcdir = 'Paintings'
dstdir = 'train'

for name, s in df.groupby('artist')['filename']:
    artistdir = os.path.join(dstdir, name)
    print(f'copying {s.shape[0]} images from {srcdir} to {artistdir}')
    os.makedirs(artistdir, exist_ok=True)
    for filename in s:
        shutil.copy(os.path.join(srcdir, name), os.path.join(artistdir, name))

输出:

copying 1 images from Paintings to train/Hieronymus Bosch
copying 3 images from Paintings to train/Hiroshige
copying 1 images from Paintings to train/Ivan Aivazovsky
...

有更快的方法(就 pandas 操作而言),但这里 copy 本身就使那个时间相形见绌了。