python - 如何根据数据框列值将目录中的图像组织成类?

标签 python bash dataframe

我有一个来自 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/

相关文章:

bash - 在 Bash 中的某个索引处插入一个元素

python - Pandas DataFrame.update() 函数中的 `overwrite` 参数有什么作用?

python - 多次匹配非捕获组

linux - 循环遍历具有相同键的关联数组

bash - 如何使 jq 将参数视为数字而不是字符串?

python - 列和多行之间的减法

python - 如何根据单独数据帧中列值的存在来过滤数据帧的行并附加第二个数据帧中的列

python - += : 'NoneType' and 'list' 不受支持的操作数类型

python - 非法指令 : 4 when importing python plugins

python - 将 .isin 应用于 pandas 中每一行的有效方法