我有一个来自 this kaggle comp 的图像目录。包含相同动物的图像在名称中具有相同的前缀,然后后跟 -{num}
,其中 num 是该特定动物的编号图像。
所以:
abc-1.jpg
abc-2.jpg
def-1.jpg
...
abg-1.jpg
abg-2.jpg
abg-3.jpg
poc-1.jpg
qrs-1.jpg
正如您所看到的,每个图像可以有不同数量的图像。
然后我有一个数据框(或 .csv),其中 1 列是每个动物文件名的前缀,另一列是类 [0,1,2,3,4,5]
,最后一列是每种动物存在的图像数量
更新:假设我们已经掌握了每种动物的图像数量
animal class num_images
abc 0 2
def 0 1
abg 2 3
poc 1 1
qrs 4 1
我想根据图像对应的类将图像组织到目录中:dir0、dir1、dir2、dir3、dir4、dir5
。
这是我想象的完成这项任务的一种方法:(绝对不是最好的方法)
我能够获得 bash 命令,该命令根据前缀将图像组织到目录中: for file in *.jpg; do mkdir -p -- "${file%%-*}"&& mv -- "$file""${file%%-*}";完成
然后以某种方式循环遍历数据框中的每个动物前缀并附加相应的 {num}
并将它们放置在名为:dir
+ {类}
最佳答案
基本命令
此答案使用与 Inder's answer 相同的方法但在单个 awk
命令中,可以更快。在这种情况下这并不重要...这里我们假设示例中给出的文件作为输入,请参阅下一节以了解替代输入格式。
awk 'NR>1 { system("mkdir -p dir"$2"; mv "$1"-* dir"$2) }' dataframe.csv
在您的示例中,这将执行以下 bash
命令:
mkdir -p dir0
mv abc-* dir0
mkdir -p dir0
mv def-* dir0
mkdir -p dir2
mv abg-* dir2
mkdir -p dir1
mv poc-* dir1
mkdir -p dir4
mv qrs-* dir4
如果目录已经存在,mkdir
的-p
选项不会导致错误。使用mv abc-* dir0
,我们将所有以abc-
开头的文件移动到目录dir0
中。
使用您的实际输入格式
从评论看来,您的实际文件的格式与您向我们展示的示例不同。该示例的列由空格分隔
animal class
abc 0
def 0
abg 2
...
但您的实际文件似乎是一个真正的 csv,其中各列以逗号分隔。此外,该文件似乎有 Windows 行结尾(\r\n
而不是 \n
)。
animal,class\r
abc,0\r
def,0\r
abg,2\r
...
您可以通过调整awk
的特殊变量FS
(用于字段分隔符)和RS
(用于记录分隔符)来使用此格式:
awk -F, -v RS='\r?\n' 'NR>1 { system("mkdir -p dir"$2"; mv "$1"-* dir"$2) }' dataframe.csv
关于python - 如何根据数据框列值将目录中的图像组织成类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54935465/