Python实现清除文件夹中重复视频

news2024/11/15 11:51:26

目录

  • 一、二进制文件
    • 二、摘要算法(MD5)
      • 三、shutil模块
        • 四、视频清除
        • 视频全在一个文件夹里
          • 视频在不同的文件夹里

一、二进制文件

二进制文件是以文本的二进制形式存储在计算机中。

用户一般不能直接读取它们,需要通过相应的软件才能将其显示出来。

二进制文件一般是可执行程序、图形、图像、声音等等。

本次实现的就是图像类型的文件,即视频!

二、摘要算法(MD5)

摘要算法又称哈希算法、散列算法。

它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

即通过摘要函数对任意长度的数据(data)计算出固定长度的摘要(digest)。

目的是为了发现原始数据是否被人篡改过。

摘要算法之所以能指出数据是否被篡改过,是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。

而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

MD5是最常见的摘要算法,速度很快,生成结果是固定的128bit字节,通常用一个32位的16进制字符串表示。

摘要算法在很多地方都有广泛的应用。

不过它并不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改。

它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。

其中Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

本次文件夹中的视频就是使用MD5摘要算法,得到视频的摘要。

相当于给了视频一个ID属性,具备唯一性。

那么通过比较视频的摘要,便可以清除重复的视频。

我们知道重复视频的文件大小肯定是一样的,那么通过文件大小应该也是可以清除重复的视频。

只不过有时也会有不重复的视频大小一样的,毕竟视频大小只是个物理属性,不具备唯一性。

三、shutil模块

shutil是高级的文件,文件夹,压缩包处理模块。

shutil.copyfile(old, new),拷贝文件函数(就是复制的意思)。

四、视频清除

以之前自动化获取的抖音视频为例。

在这里插入图片描述
共183个抖音视频。

视频全在一个文件夹里

我新建了两种文件夹,一种视频全在一个文件夹里的。

在这里插入图片描述
这种使用视频大小作为筛选比较。

清除重复视频代码如下。

import os
import shutil

# 递归文件夹创建
folder_path = 'F:/video/douyin_11'
os.makedirs(folder_path)
# 获取文件夹里的文件名字符串列表
filenames = os.listdir('F:\\video\\douyin_1')

(size_list, name_list) = ([], [])
for name in filenames:
    # 获取文件的路径
    file_path = 'F:\\video\\douyin_1\\' + name
    # 获取文件的大小
    file_size = os.path.getsize(file_path)
    # 如果不是重复视频的话,大小应该和列表中数据不一样
    if file_size not in size_list:
        # 获取不重复视频的大小
        size_list.append(file_size)
        # 获取不重复视频的路径
        name_list.append(file_path)

# 使用shutil模块的copyfile函数,复制文件到新的文件夹中去
num = 0
for filename in name_list:
    num += 1
    oldname= filename
    newname= 'F:\\video\\douyin_11\\' + str(num) + '.mp4'
    shutil.copyfile(oldname, newname)

最后在新的文件夹中生成了183个视频文件。

在这里插入图片描述
说明成功清除了重复的视频文件。

视频在不同的文件夹里

另一种视频分为几个部分,分别在不同文件夹下。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
与上面不同的是,需要遍历文件夹,然后再去遍历文件夹中的文件。

另外使用摘要算法(MD5),生成视频的特有ID,以此作为标准。

清除重复视频代码如下。

import os
import shutil
import hashlib


# 摘要算法(MD5)实现视频摘要获取
def getmd5(file_path):
    # 判断文件路径是否存在及文件是否为一个文件,意思应该是文件夹就会报错
    if not os.path.isfile(file_path):
        return
    # rb,以二进制读模式打开
    vediofile = open(file_path, 'rb')
    md5 = hashlib.md5()
    md5.update(vediofile.read())
    vediofile.close()
    # 返回视频文件的MD5值
    return md5.hexdigest()

# 递归文件夹创建
folder_path = "F:/video/douyin_22"
os.makedirs(folder_path)
# 获取文件夹里的文件夹名字符串列表
foldernames = os.listdir('F:\\video\\douyin_2')
python学习群:748989764
(value_list, name_list) = ([], [])
for folder in foldernames:
    # 获取文件夹的路径
    folder_name = 'F:\\video\\douyin_2\\' + folder
    # 获取文件夹里的文件名字符串列表
    file_names = os.listdir(folder_name)
    for file_name in file_names:
        # 获取文件的路径
        file_path = folder_name + '\\' + file_name
        # 获取文件的MD5值
        value = getmd5(file_path)
        # 如果不是重复视频的话,MD5值应和列表中数据不一样
        if value not in value_list:
            # 获取不重复视频的MD5值
            value_list.append(value)
            # 获取不重复视频的路径
            name_list.append(file_path)

# 使用shutil模块的copyfile函数,复制文件到新的文件夹中去
num = 0
for filename in name_list:
    num += 1
    oldname= filename
    newname= 'F:\\video\\douyin_22\\' + str(num) + '.mp4'
    shutil.copyfile(oldname, newname)

最后也在新的文件夹中生成了183个视频文件。

在这里插入图片描述
说明也成功清除了重复的视频文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/185156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jspssm大学生宿舍管理系统-宿管带前端

目录 摘 要 II Abstract III 1 绪论 1 1.1 课题背景 1 1.2 课题研究现状 1 1.3 初步设计方法与实施方案 2 1.4 本文研究内容 2 2 系统开发环境 4 2.1 JSP技术 4 2.2 B/S架构 5 2.3 Eclipse环境配置 5 2.4 MySQL数据库 6 3 系统分析 7 3…

【微服务】Docker容器化

🚩本文已收录至专栏:微服务探索之旅 👍希望您能有所收获 一.引入 (1) 为什么需要Docker 微服务虽然具备各种各样的优势,但服务的拆分的非常多给部署带来了很大的麻烦。 分布式系统中,依赖的组件非常多,不同…

【1】Python基础语法

字面量 字面量:在程序中,被写下来的固定值,称之为字面量。Python中常用的6种数据类型: 字符串(string),又称文本,是由任意数量的字符如中文、英文、各类符号、数字等组成&#xff0…

虚拟化技术学习笔记10

虚拟机镜像管理 学习目标: 能够了解KVM虚拟机支持的镜像格式 能够使用qemu-img实现镜像创建 能够使用qemu-img实现镜像查看 能够使用qemu-img实现镜像格式转换 能够了解后备镜像的作用 能够了解差量镜像的作用 能够基于后备镜像制作差量镜像 能够使用差量镜…

[网鼎杯 2020 朱雀组]Nmap(双解详细分析)

目录 Nmap 相关参数 信息收集 思路 方法一 方法二 nmap常见操作 Nmap 相关参数 -iL 读取文件内容,以文件内容作为搜索目标 -o 输出到文件 -oN 标准保存 -oX XML保存 -oG Grep保存 -oA 保存到所有格式 信息收集 可以对ip进行扫描 思路 方法一 将一句话木马…

【高并发】- 生产级系统搭建 - 3

前言 本章讲解高并发系统动静分离方案设计、热点数据处理、管控等思想。 1. 动静分离方案设计 动静分离实质,将静态页面与动态页面(或者静态数据与动态数据)解耦分离,用不同系统承载对应流量。这样可以提升整个服务的访问性能和可…

MySql性能优化(五)优化细节

优化细节 当使用数据库列进行查询的时候尽量不要使用表达式,把计算结果放到业务层而不是数据层尽量使用主键索引,而不是其他索引,因此主键索引不会触发回表查询使用前缀索引 有的时候需要索引很长的字符串,这会让索引变的大且慢&…

Ethercat系列(1)COE非周期性数据通信

Ethercat主站通过读写邮箱数据SM通道实现非周期性数据通信。邮箱数据定义邮箱数据单元结构邮箱数据头各字段含义如下表非周期性邮箱数据通信EtherCAT协议中非周期性数据通信称为邮箱数据通信,它可以双向进行---主站到从站和从站到主站。它支持全双工,两个…

存储介质还是存储载体,这不是个问题

在档案领域中,“介质”和“载体”到底有什么区别?能不能混用?这个问题曾经困扰了笔者10几年,直到最近才发觉原来根本不是一个问题。我们先来看两句话: 1、磁盘、光盘、固态硬盘等常见数据存储载体的寿命无法满足电子档…

RabbitMQ快速入门和使用

文章目录1. 基础理论1.1. 同步调用与异步调用1.2. RabbitMQ 安装与运行1.2.1. 常见消息模型2. 基本消息队列的应用2.1. 消息发送流程2.2. 消息接收流程3. SpringAMQP的基础理论与应用(想快速应用看这里)3.1. 基础理论3.2. 【案例一】实现HelloWorld中的基础消息队列功能3.3. 【…

Neo4j数据库模糊查询

1、Neo4j单个查询条件模糊查询1.1使用 ~’.模糊匹配对象.’ 进行表示1.1.1 查询节点MATCH(n:Author) WHERE n.name ~.*梦.* RETURN n1.1.2 查询关系MATCH p({title:锆石U-Pb和Lu-Hf同位素研究内蒙乌努格吐山斑岩型铜钼矿岩浆岩特征})-[r:has_illustration]->(i:Illustration…

Python应用开发——制作bin文件

Python应用开发——制作bin文件 目录Python应用开发——制作bin文件前言1 环境搭建2 代码编写与测试结束语前言 什么是bin? bin是二进制文件,其用途依系统或应用而定。一种文件格式binary的缩写。一个后缀名为".bin"的文件,只是表…

无代码配置态势感知分析应用,预判你的预判

森林发生火势灾情时,应急管理中心快速做出部署,实时监测并分析演变趋势大型交通事故发生,应急指挥中对前端人员、车辆的远程调度线路规划实时监测无人机对电站电厂的运维工作公安警务对嫌疑人、嫌疑车辆等目标的跟踪侦查……以上这些&#xf…

Acwing---基础算法(一)

文章目录 快速排序归并排序整数二分浮点数二分一、快速排序 #include<iostream>using namespace std;const int N 1e6 10;int n; int q[N];void quick_sort(int q[], int l, int r) {//此时区间只有一个数或者没有数不需要排序了if (l > r) return;int x q[l], i…

【QCA】【实例】高通DTS中添加BLSP设备节点的基本配置

文章目录0. env1. 简介2. 需求及资料2.1 需求2.2 资料3. DTS实际配置及简述0. env IPQ601x SPF11.5cs 1. 简介 BLSP(BAM Low-Speed Peripheral) 不同chip有不止一组的BLSP&#xff0c;每个BLSP又有多个端口供使用。 每个端口功能可以复用为&#xff1a;SPI 或者 I2CUART 2. 需求…

计算机网络知识详解之:TCP连接原理详解

网络知识详解之&#xff1a;TCP连接原理详解 文章目录网络知识详解之&#xff1a;TCP连接原理详解TCP连接三次握手一、准备工作二、一次握手三、二次握手四、三次握手为什么TCP客户端最后还要发送一次确认呢&#xff1f;为什么要3次握手?握手中的SYN超时重试TCP协议缺陷四次挥…

HECS 安装mqtt

下载(hecs &#xff0c;centos8的样子&#xff0c;对mosquitto 版本高了安装不了)wget https://mosquitto.org/files/source/mosquitto-1.5.9.tar.gztar -zxvf mosquitto-1.5.9.tar.gz安装前置工具yum install gcc-cyum install cmakeyum install openssl-devel编译cd mosquitt…

Vue项目启动后跳转到制定路由页面

前言 今天把自己的项目布局完成了&#xff0c;但是想在项目启动的时候默认跳转到登录页面。 这其实需要借助路由实现跳转 开始编写之前&#xff0c;大家可以看下我的布局&#xff1a; 安装并使用路由 关于如何安装并使用路由&#xff0c;可以参考&#xff1a;Vue安装并使用路…

LeetCode_单周赛_330

6337. 统计桌面上的不同数字 代码 后面出现的数字都是小于 n 的。 n 1 时&#xff0c;答案是 1。 n > 1时&#xff1a; 第一天&#xff0c;n % (n - 1) 1&#xff0c;n - 1会被加入第二天&#xff0c;(n - 1) % (n - 2) 1&#xff0c;n - 2 被加入 递推&#xff0c;一…

Java 8 Optional 介绍

1. 前言 空指针确实会产生很多问题&#xff0c;我们经常遇到空的引用&#xff0c;然后又想从这个空的引用上去获取其他的值&#xff0c;接着理所当然的碰到了 NullPointException。这是你可能会想&#xff0c;这报错很好处理&#xff0c;然后你看了眼报错行数&#xff0c;对比了…