下面是针对“python删除文件夹下相同文件和无法打开的图片”的完整攻略:
1. 安装依赖
首先,需要通过pip安装Pillow以及imagehash这两个库来帮助我们实现相同图片的比对和识别。安装指令如下:
pip install Pillow
pip install imagehash
2. 检测相同图片
我们可以使用imagehash库中的average_hash()
函数进行图片比对。将输入图片转换成hash值,然后比对即可。
具体步骤如下:
from PIL import Image
import imagehash
import os
def get_hash(file_path):
with open(file_path, 'rb') as f:
img = Image.open(f)
return str(imagehash.average_hash(img))
# 输入文件夹路径
input_dir = "path/to/input/dir"
# 存储hash值的字典
hash_dict = dict()
# 遍历所有文件
for file_name in os.listdir(input_dir):
file_path = os.path.join(input_dir, file_name)
if os.path.isfile(file_path): # 如果是文件,而非文件夹
try:
# 获取hash值,并存入字典中
file_hash = get_hash(file_path)
hash_dict.setdefault(file_hash, [])
hash_dict[file_hash].append(file_path)
except:
# 如果出现无法打开的图片,则跳过
print("Error occurs when opening image: {}".format(file_path))
# 输出hash值相同的所有文件
for file_hash, file_list in hash_dict.items():
if len(file_list) > 1: # 如果存在多个文件hash值相同
print("Hash: {}, {}".format(file_hash, file_list))
代码中,我们首先定义了一个get_hash()
函数,用于获取单个图片的hash值。然后,我们遍历输入文件夹下的所有文件,在遍历的过程中,如果是文件而非文件夹,则获取其hash值,并存入字典中。
最后,我们输出hash值相同的所有文件。如果存在多个文件的hash值相同,则说明它们是相同的图片。
3. 删除相同图片
如果我们想要删除相同的图片,我们需要在代码步骤2的基础上进行些许调整。具体地,在输出hash值相同的所有文件时,除了输出文件路径,我们还需要将其中的一个文件删掉。代码按以下方式调整:
...
# 输出hash值相同的所有文件
for file_hash, file_list in hash_dict.items():
if len(file_list) > 1: # 如果存在多个文件hash值相同
print("Hash: {}, {}".format(file_hash, file_list))
# 删除某个相同图片
os.remove(file_list[0])
...
删掉哪个图片可以自由选择一个即可。
4. 示例说明
下面提供两个示例说明:
示例1:检测相同图片
以以下文件夹为例:
input_dir/
|- cat1.jpg
|- cat2.jpg
|- dog.jpg
|- unknown.gif
我们运行以上程序,输出如下:
Error occurs when opening image: input_dir/unknown.gif
Hash: 7e7e7e7e7e7e7e7e ['/path/to/cat1.jpg', '/path/to/cat2.jpg']
可以看到,输出结果中,我们 successfully detected 存在两张相同的图片(即cat1.jpg和cat2.jpg),并将它们的路径输出。
示例2:删除相同图片
继续以上面的文件夹为例,我们进一步修改代码,删除其中一张相同的图片。修改后的代码如下:
...
# 输出hash值相同的所有文件
for file_hash, file_list in hash_dict.items():
if len(file_list) > 1: # 如果存在多个文件hash值相同
print("Hash: {}, {}".format(file_hash, file_list))
# 删除某个相同图片
os.remove(file_list[0])
...
接着,我们运行程序,再次遍历文件夹,发现cat1.jpg已被成功删除。接下来的文件夹内容如下:
input_dir/
|- cat2.jpg
|- dog.jpg
|- unknown.gif
以上就是针对“python删除文件夹下相同文件和无法打开的图片”的完整攻略,细节步骤和示例说明都已介绍。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python删除文件夹下相同文件和无法打开的图片 - Python技术站