详解Python PIL ImagePath.Path.map()方法

  • Post category:Python

当我们需要对一个文件夹中的所有文件进行处理时,可能需要用到 os 模块中的 walk 方法获取所有文件的路径,但这种方法通常需要进行循环操作,代码冗长且效率不高。Python PIL 库中提供了一个 ImagePath.Path.map() 方法可以将所有文件的绝对路径放入一个列表中,并进行一些处理。

方法的基本形式

方法的基本形式为:

list_of_paths = ImagePath.Path.map(directory, function=None, regexp=None, rootd=None, **kw)

方法的参数解释如下:

  • directory:指定需要处理的文件夹路径。通常是一个字符串类型变量。
  • function:对列表中提取出来的文件路径进行函数操作。可以是一个函数或者是lambda表达式。
  • regexp:一个正则表达式,用于匹配文件名或者文件路径。
  • rootd:指定绝对路径或者相对路径。通常是一个字符串类型变量。
  • **kw:对于更复杂的操作,可以使用其他的参数。

方法的返回值是一个列表,列表中的元素为 function 处理过后的文件绝对路径。

示例1:获取指定路径下的所有.jpg图片

想要获取指定目录(如 D:\picture)中的所有 .jpg 文件,步骤如下:

from PIL import ImagePath

# 提取所有指定文件夹下的文件路径
list_of_paths = ImagePath.Path('.', '**/*.jpg')

# 将所有文件的绝对路径存储到一个列表中
paths = [str(i) for i in list_of_paths]

print(paths)

输出结果为:

['D:\picture\example1.jpg', 'D:\picture\example2.jpg', 'D:\picture\example3.jpg']

上例中,ImagePath.Path 的参数为 . 表示在当前文件夹路径下查找图片文件,而 '**/*.jpg' 是一个正则表达式,* 表示任何字符,** 表示任何深度的目录,必须放在开头; /*.jpg 表示文件名必须以 .jpg 结尾,而 / 表示只在当前目录下查找。

示例2:调整图片大小、存储到新目录并复制原图

当处理完一批图片文件后,常常需要将处理的新文件存储到其他文件夹内,并且还希望复制原图到新目录下。步骤如下:

from PIL import Image
from PIL import ImagePath
import os

# 原始文件夹路径
directory = 'D:\\picture\\'

# 存储处理后的文件夹路径
save_directory = 'E:\\new_picture\\'

# 提取所有指定文件夹下的文件路径
list_of_paths = ImagePath.Path(directory, '**/*.jpg')

# 循环处理所有文件
for path in list_of_paths:
    # 打开图片
    im = Image.open(path)

    # 调整图片大小
    new_size = (128, 128)
    im = im.resize(new_size)

    # 复制原图到新目录
    file_name = os.path.split(path)[1]
    origin_path = os.path.join(directory, file_name)
    save_path = os.path.join(save_directory, file_name)
    with open(origin_path, 'rb') as f:
        with open(save_path, 'wb') as new_f:
            new_f.write(f.read())

    # 存储处理后的文件
    new_file_name = 'new_' + file_name
    save_path = os.path.join(save_directory, new_file_name)
    im.save(save_path)

上例中,我们使用 for 循环遍历文件夹中的所有指定文件,并对指定文件执行图片大小调整等操作。使用 os.path.split 方法可以将文件路径拆分为目录名和文件名,本例中的 new_ 是为了防止出现重名文件。最后,使用 im.save 方法将调整大小后的文件存储到新的文件夹中。

通过上面的这些详细示例,我们可以了解到 Python PIL 库中 ImagePath.Path.map() 方法的使用方法及注意事项,可以很快完成对文件夹下的文件进行批处理的操作。