我需要写一个Python脚本来排序图片,怎么做?

3 投票
1 回答
11729 浏览
提问于 2025-04-18 03:27

我想要一个脚本,可以把一大堆图片整理到不同的文件夹里。

我在展会上拍狗狗的照片,比如我拍了好几张狗1的照片,这些照片的名字都是按顺序命名的(比如Dog1-1、Dog1-2、Dog1-3等等)。狗2的照片也是这样命名。

我希望这个脚本能把Dog1-1到Dog1-10的照片移动到一个叫“Dog 1”的文件夹里,把Dog2-1到Dog2-10的照片移动到一个叫“Dog 2”的文件夹里,依此类推。

我该怎么用Python来实现这个呢?

1 个回答

6

基本上,你想要做的事情是:

  1. 找到指定文件夹里的每一个文件
  2. 取每个文件名的第一部分,作为文件夹的名字
  3. 如果这个文件夹不存在,就创建它
  4. 把文件移动到这个文件夹里
  5. 重复以上步骤

太棒了!弄清楚我们想做什么是成功的一半——接下来,主要就是在网上查资料,把这些想法变成代码。

首先,我们需要指定要检查的文件夹:

folder_path = "myfolder"

接下来,我们想要找到那个文件夹里的每一个文件。快速查一下网上,找到了 这个方法

import os
import os.path

images = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]

顺便提一下,我会经常用到 os.path.join,所以你可能想简单了解一下它的作用。你在评论中提到的指南对它讲解得很不错。

现在,我们需要获取每个文件名的第一部分。我假设我们会把第一个破折号前的内容当作文件夹名,后面的部分就不管了。实现这个的一个方法是使用 string.split,它可以根据指定的字符把一个字符串分割成一个字符串列表,然后我们取第一个元素:

for image in images:
    folder_name = image.split('-')[0]

接下来,如果这个文件夹还不存在,我们就要创建它。同样,网上查查就能找到方法:

new_path = os.path.join(folder_path, folder_name)
if not os.path.exists(new_path):
    os.makedirs(new_path)

最后,我们要 移动原始文件

import shutil

old_image_path = os.path.join(folder_path, image)
new_image_path = os.path.join(new_path, image)
shutil.move(old_image_path, new_image_path)

把这些步骤结合起来:

import os
import os.path
import shutil

folder_path = "test"

images = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]

for image in images:
    folder_name = image.split('-')[0]

    new_path = os.path.join(folder_path, folder_name)
    if not os.path.exists(new_path):
        os.makedirs(new_path)

    old_image_path = os.path.join(folder_path, image)
    new_image_path = os.path.join(new_path, image)
    shutil.move(old_image_path, new_image_path)

撰写回答