=Start=
缘由:
简单整理一下,方便后面有需要的时候参考。
正文:
参考解答:
一般情况下我直接用 ls
或 find
命令就处理了,但是对于某些要排序的场景,前面两个命令支持的不是太好,还是用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
)的路径列表。
如果需要根据文件名中的数字进行排序,而不是简单的字典顺序,我们需要解析文件名中的数字,并基于这些数字来进行排序。我们添加了一个辅助函数extract_numbers
,它使用正则表达式来查找文件名(不包括扩展名)中的所有连续数字,并将它们以整数列表的形式返回。然后,在对图片文件进行排序时,我们使用这个函数作为排序的关键字。这样可以确保文件是按照文件名中的数字从小到大排序的,而不是简单地按字母顺序排序。
请注意,如果一个文件名中有多个数字,此方法会将这些数字作为一个列表处理,并据此进行排序。例如,文件名img1_20.png
和img2_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=