Python脚本实现自动检测并重命名非正常图片文件
概述
在日常的文件管理和数据处理中,我们可能会遇到一些文件名虽然以特定扩展名结尾,但实际内容并不符合该格式的情况。例如,某些文件可能被错误地标记为 .jpg
文件,但实际上它们可能是其他类型的文件,如视频文件。这种情况下,如果我们依赖文件扩展名来处理文件,就可能导致程序出现错误或无法正确处理文件。
本文介绍的Python脚本旨在解决这一问题,特别是针对被误标为 .jpg
的文件进行检测,并将那些实际上不是图像文件的项重命名为更合适的扩展名(如 .mp4
)。这有助于确保目录中的所有文件都能被正确识别和处理。
代码详解
环境准备
首先,我们需要导入必要的模块:
os
模块用于与操作系统交互,执行诸如遍历目录、检查文件路径以及重命名文件等操作。PIL.Image
是 Python Imaging Library (Pillow) 中的一部分,提供了打开和验证图像文件的功能。
import os from PIL import Image
定义目标目录
接下来,定义一个变量 output_dir
来存储要处理的图片文件所在的目录路径。在这个例子中,目录名为 tupian
。
output_dir = 'tupian'
遍历文件
使用 os.listdir(output_dir)
函数获取指定目录下的所有文件名,并通过循环逐一处理每个文件。为了确保我们只处理 .jpg
文件,使用了字符串方法 endswith()
来检查文件名是否以 .jpg
结尾(忽略大小写)。
for filename in os.listdir(output_dir): file_path = os.path.join(output_dir, filename) if filename.lower().endswith('.jpg'): # 处理 .jpg 文件 else: print(f"文件 {filename} 不是 JPG 文件,跳过处理")
图像文件验证
对于每个 .jpg
文件,尝试使用 Image.open()
方法打开它,并调用 img.verify()
方法来检查文件是否为有效的JPEG图像。如果文件不能被正确打开或者验证失败,则捕获异常并认为这不是一个正常的 JPG 文件。
try: with Image.open(file_path) as img: img.verify() except (IOError, SyntaxError): # 处理非正常图像文件 else: print(f"文件 {filename} 是正常的 JPG 文件")
重命名非正常文件
当发现一个文件不是正常的 JPG 文件时,我们希望将其重命名为更合适的名字。这里假设这些文件实际上是视频文件,并将它们的扩展名改为 .mp4
。为此,我们使用 os.rename()
函数来更改文件名,并打印一条消息来通知用户发生了什么。
new_filename = filename.rsplit('.', 1)[0] + '.mp4' new_file_path = os.path.join(output_dir, new_filename) os.rename(file_path, new_file_path) print(f"文件 {filename} 不是正常的 JPG 文件,已重命名为 {new_filename}")
总代码如下
import os from PIL import Image # 定义目录路径 output_dir = 'tupian' # 遍历目录中的所有文件 for filename in os.listdir(output_dir): file_path = os.path.join(output_dir, filename) # 检查文件是否为 .jpg 文件 if filename.lower().endswith('.jpg'): try: # 尝试打开文件 with Image.open(file_path) as img: img.verify() # 验证文件是否为有效的图像文件 except (IOError, SyntaxError): # 如果无法打开或验证文件,则认为该文件不是正常的 JPG 文件 new_filename = filename.rsplit('.', 1)[0] + '.mp4' new_file_path = os.path.join(output_dir, new_filename) # 重命名文件 os.rename(file_path, new_file_path) print(f"文件 {filename} 不是正常的 JPG 文件,已重命名为 {new_filename}") else: print(f"文件 {filename} 是正常的 JPG 文件") else: print(f"文件 {filename} 不是 JPG 文件,跳过处理")