用Python进行文件遍历并排序


=Start=

缘由:

简单整理一下,方便后面有需要的时候参考。

正文:

参考解答:

一般情况下我直接用 lsfind 命令就处理了,但是对于某些要排序的场景,前面两个命令支持的不是太好,还是用Python写个脚本更合适。

场景1:对macOS系统截图生成的文件排序

~/Desktop/截屏2025-02-18 20.29.04.png
~/Desktop/截屏2025-02-18 20.29.51.png
~/Desktop/截屏2025-02-18 20.30.13.png
~/Desktop/截屏2025-02-18 20.30.33.png
……

解决办法:
直接 ls 或者以命令行通配符的形式(*)传递给程序就好,会按照文件名中的时间的先后顺序进行展示。

比如我现在要对所有在 2025-02-18 这天截图的文件按顺序进行OCR,可以使用通配符的方式将其传递给下面的Python程序:

#!/usr/bin/env python3
# coding=utf-8

import sys, time
from ocrmac import ocrmac

def main():
    for item in sys.argv[1:]:
        # annotations = ocrmac.OCR(item, language_preference=['zh-Hans'], framework="livetext").recognize()
        annotations = ocrmac.OCR(item, language_preference=['zh-Hans']).recognize()
        for x in annotations:
            print(x[0])
        #
        print()
    #

if __name__ == '__main__':
    main()

使用通配符的方式进行参数展开:

# 下面这种通配符的方式会自动进行参数展开(按字典顺序),假设上面代码的文件名为 py_ocrmac_cmdline.py
$ python py_ocrmac_cmdline.py ~/Desktop/截屏2025-02-18*

场景2:对macOS自动操作将PDF页面渲染为图像生成的文件排序

$ ls /private/var/folders/4s/sl3gwydeep38sbbygrntx_c00000gn/T
...
路在何方 2.jpeg
路在何方 3.jpeg
路在何方 4.jpeg
路在何方 5.jpeg
路在何方.jpeg
...

解决办法:

为了实现一个按顺序遍历指定目录下所有图片文件的Python函数,我们可以使用os模块或pathlib模块来处理目录和文件操作。这里提供了一个使用pathlib的例子,因为它提供了更直观和面向对象的方式来处理路径。

我们将定义一个函数,它接受一个目录路径作为参数,并返回该目录及其子目录中所有图片文件(这里假设图片文件的扩展名为.png, .jpg, .jpeg, .bmp, .gif, .tiff)的路径列表。

请注意,如果一个文件名中有多个数字,此方法会将这些数字作为一个列表处理,并据此进行排序。例如,文件名img1_20.pngimg2_10.png会被正确排序为img1_20.png, img2_10.png,因为排序首先比较第一个数字,只有在第一个数字相同的情况下才会比较后续的数字。如果你的情况更复杂,可能需要调整extract_numbers函数来更好地满足需求。

当我们处理文件路径时,使用Path对象的stem属性可以获取不包含路径和扩展名的文件名部分。然后,我们可以从这个部分提取数字用于排序。

下面是更新并确保正确的代码示例:

import re
from pathlib import Path

def extract_numbers(filename):
    """从文件名中提取所有的连续数字"""
    return [int(match) for match in re.findall(r'\d+', filename)]

def traverse_images(directory):
    # 定义支持的图片扩展名
    image_extensions = {'.png', '.jpg', '.jpeg', '.bmp', '.gif', '.tiff'}

    # 使用Path对象表示目录
    dir_path = Path(directory)

    # 查找所有符合扩展名的文件,并转换为绝对路径
    images = [image for image in dir_path.rglob('*') if image.is_file() and image.suffix.lower() in image_extensions]

    # 根据文件名中的数字排序
    images.sort(key=lambda x: extract_numbers(x.stem))

    # 返回排序后的绝对路径列表
    return [str(image.absolute()) for image in images]

# 示例调用
if __name__ == "__main__":
    directory = "/path/to/your/directory"  # 替换为你的目标目录路径
    images = traverse_images(directory)
    for img in images:
        print(img)

在这个例子中:

  • dir_path.rglob('*'):递归搜索指定目录下的所有文件。
  • image.is_file():确保只考虑文件(排除目录)。
  • image.suffix.lower() in image_extensions:检查文件扩展名是否在定义的支持图片格式列表中。
  • x.stem:获取文件名(不包括路径和扩展名),用于从中提取数字进行排序。

这样,我们就可以根据文件名中的数字对图片文件进行排序了。如果文件名中有多个数字,它们会被作为一个整数列表进行比较,从而实现基于数字顺序的排序。

参考链接:

DeepSeek
https://chat.deepseek.com/

通义千问
https://tongyi.aliyun.com/qianwen/

=END=


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注