当我们需要对一个文件夹中的所有文件进行处理时,可能需要用到 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() 方法的使用方法及注意事项,可以很快完成对文件夹下的文件进行批处理的操作。