python删除文件夹下相同文件和无法打开的图片

yizhihongxing

下面是针对“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技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Python文件操作的方法

    当我们使用Python进行编程工作时,文件操作是一个非常基础并且重要的工作。Python提供了许多内置的文件操作方法,下面是一些常见的Python文件操作的方法: Python文件操作的方法 打开文件 在Python中,我们可以通过open()函数打开一个文件,这个函数的基本语法如下: f = open(file, mode=’r’, buffering=-…

    python 2023年5月30日
    00
  • Python利用re模块实现简易分词(tokenization)

    Python利用re模块实现简易分词(tokenization) 在自然语言处理中,分词是一个非常重要的任务。分词的目的是将一段文本分成若干个词语,以便后续的处理。在本文中,我们将介绍如何使用Python的re模块实现简易分词。 re模块简介 re模块是Python中用于正则表达式操作的模块。正则表达式是一种用于匹配字符串的模式,可以用于字符串的搜索、替换、…

    python 2023年5月14日
    00
  • python添加模块搜索路径方法

    添加模块搜索路径是在Python中很常见的操作,可以让我们很方便地引用自己编写的模块或第三方模块。 下面介绍两种添加模块搜索路径的方法: 方法一:sys.path.append() 在Python中,我们可以使用sys.path来查看当前Python解释器的所有模块搜索路径。我们可以使用sys.path.append()方法来添加自己的模块搜索路径。 imp…

    python 2023年6月3日
    00
  • Python魔术方法专题

    Python魔术方法专题攻略 什么是魔术方法 在Python中,以双下划线开头和结尾的方法,被称为”魔术方法”或”魔法方法”。这些方法是具有特殊含义的,可以提供类的对象行为修改和自定义的能力。比如:__init__、__str__、__repr__等。以下是魔术方法的常见用途:- 构造函数- 对象初始化- 对象销毁- 对象字符串表达式- 对象迭代- 比较对象…

    python 2023年5月13日
    00
  • python对excel文档去重及求和的实例

    下面是“Python对Excel文档去重及求和的实例”的完整实例教程。 目录 准备工作 去重实例 求和实例 总结 准备工作 在开始代码之前,我们需要安装pandas和openpyxl模块,pandas用于数据操作,openpyxl用于读写Excel文件。可以使用以下命令来安装: pip install pandas openpyxl 去重实例 在此实例中,我…

    python 2023年5月13日
    00
  • python实现八大排序算法(1)

    下面是关于“Python实现八大排序算法(1)”的完整攻略。 1. 八大排序算法 排序算法是计算科学中最基本的算法之一,也是Python开发者必须掌握的算法之一。Python中常见的排序算法包冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序、计数排序和桶排序。下面将逐一介绍这些算法的实现方法。 1.1 冒泡排序 冒泡排序算法是一种简单的排序算法,它的…

    python 2023年5月13日
    00
  • Python网络编程使用select实现socket全双工异步通信功能示例

    下面就是详细的 Python 网络编程使用 select 实现 socket 全双工异步通信功能的攻略。 1、什么是 select select 是一种 I/O 多路复用机制,它可以监控多个文件描述符,等待输入或输出操作就绪,从而实现启用一个线程或一个进程就能同时管理多个连接通道。 2、select 的优劣 优点:select 可以同时监听多个连接,无需通过…

    python 2023年5月19日
    00
  • Python标准库calendar的使用方法

    下面是关于Python标准库calendar的使用方法的完整攻略。 标准库calendar calendar是Python标准库中的模块,提供了一些处理日历信息的函数。 calendar模块的导入 在使用calendar库之前,需要先导入calendar模块: import calendar 周相关函数 calendar提供了一些获取与周相关的信息的函数: …

    python 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部