iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python怎么实现文件自动去重
  • 160
分享到

Python怎么实现文件自动去重

2023-06-15 08:06:34 160人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要介绍python怎么实现文件自动去重,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Python 文件自动去重平日里一来无聊,二来手巧,果然下载了好多无(luan)比(qi)珍(ba)贵(zao)的资料,搞

这篇文章主要介绍python怎么实现文件自动去重,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

Python 文件自动去重

平日里一来无聊,二来手巧,果然下载了好多无(luan)比(qi)珍(ba)贵(zao)的资料,搞得我小小的硬盘(已经扩到6T了)捉襟见肘,

有次无意间,发现有两个居然长得一毛一样,在房子这么小的情况下,我怎能忍两个一毛一样的东西不要脸皮的躺在我的硬盘里,果断搞掉一个,整理一下,本来想文件名一样的就保留一份,但问题出现了,居然有名字一样,内容却完全不一样的文件,想我背朝黄土面朝天吹着空调吃着西瓜下载下来的东西,删除是不可能的,这辈子都是不可能删除的。可是我也又不能把这数以亿计的文件挨个打开看看里面一样不一样吧,这个工程我大概够我做了好久好久了,有没有办法搞个软件帮帮我呢,答案是肯定的,要不然我也不用在这里写这个博客了(应该是苦逼的一个一个打开比较吧),说正题,Python提供了一个比较文件内容的东西,那就是。。。。。。。。。。哈希算法

MD5消息摘要算法(英语:MD5 Message-Digest AlGorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。

说了这么长,总结出来就一句,这玩意就是文件的指纹,几乎每个文件是唯一的(碰到重复的,恭喜你,可以去买彩票了),那我们就把这个指纹拿出来,一个一个比对,肯定不能会有漏网的文件,既不会错杀三千,也不使一文件漏网,原理上通了,那么我们就要去搞个代码来帮我完成这个工作,作为最好用的语言,Python就这样被我翻了牌子

# -*- coding:utf-8 -*-import osimport hashlibimport timeimport sys#搞到文件的MD5def get_ms5(filename):    m = hashlib.md5()    mfile = open(filename , "rb")    m.update(mfile.read())    mfile.close()    md5_value = m.hexdigest()    return md5_value#搞到文件的列表def get_urllist():    base = ("D:\\lwj\\spider\\pic\\")#这里就是你要清缴的文件们了    list = os.listdir(base)    urllist = []    for i in list:        url = base + i        urllist.append(url)     return urllist#主函数if __name__ == '__main__':    md5list = []    urllist = get_urllist()    print("test1")    for a in urllist:        md5 = get_ms5(a)        if(md5 in md5list):            os.remove(a)            print("重复:%s" % a)        else:            md5list.append(md5)            print("一共%s张照片" % len(md5list))

效果

Python怎么实现文件自动去重Python怎么实现文件自动去重

python3 大文件去重

一、生成待去重数据

每行是固定位数的数字串

import osfrom random import randint#-- from u_工具 import *print("———— 开始 ————")#-- 打点() # 用来配置的变量位数 = 13行数 = 500 * 10000 输出目录 = "./a_输入"输出文件 = f"{输出目录}/随机数.txt" # 预处理_00 = "".join(["0" for i in range(位数 - 1)])_100 = "1" + _00最小值 = int(_100)_1000 = _100 + "0"最大值 = int(_1000) if not os.path.exists(输出目录):    os.makedirs(输出目录)#-- 输出文件 = 文件名防重_追加数字(输出文件) # 实际处理with open(输出文件,"a") as f:    for i in range(行数):         f.write(f"{randint(最小值, 最大值)}\n")         百分比 = (i+1) / 行数 * 100        if 百分比 == int(百分比):            print(f"已完成{int(百分比)}%")#-- 打点()#-- print(f"\n总耗时:{计时(0)}")print("———— 结束 ————")

Python怎么实现文件自动去重Python怎么实现文件自动去重

二、通过set按行去重

1. 按原值比较

(1)读取全部数据

(2)用split来分行

(3)通过set数据结构来去除重复数据

(4)将set的数据写入文件

import os#-- from u_工具 import *print("———— 开始 ————")#-- 打点() # 用来配置的变量输入目录 = "./a_输入"输出目录 = "./b_输出"输出文件 = f"{输出目录}/去重结果.txt"# 预处理# 目录不存在就手动建立if not os.path.exists(输出目录):    os.makedirs(输出目录)if not os.path.exists(输入目录):    os.makedirs(输入目录)#-- 输出文件 = 文件名防重_追加数字(输出文件) # 获取待去重文件待去重文件列表 = []待去重文件列表 = [f"{输入目录}/{i}" for i in os.listdir(输入目录)]#-- getDeepFilePaths(待去重文件列表,输入目录,"txt")print(f"\n总共{len(待去重文件列表)}个文件") 换行符 = b"\n"if platfORM.system().lower() == 'windows':    换行符 = b"\r\n" # 实际处理all_lines = []文件个数 = 0for 文件 in 待去重文件列表:    文件个数 += 1    print(f"\n处理第{文件个数}个文件")     #-- 打点()    # (1)读全部    with open(文件, "rb") as f:        data = f.read()     # (2)split分行    lines = data.split(换行符)    all_lines.extend(lines)    #-- 打点()    #-- print(f"分行完毕,耗时:{计时()}") # (3)集合去重all_lines_set = set(all_lines)all_lines_set.remove(b"")#-- 打点()#-- print(f"\n\n去重完毕,耗时:{计时()}") # (4)循环写入with open(输出文件,"ab") as f_rst:    for line in all_lines_set:        f_rst.write(line + 换行符)#-- 打点()#-- print(f"\n写入完毕,耗时:{计时()}")print(f"\n输出文件:{输出文件}") #-- 打点()#-- print(f"\n\n总耗时:{计时(0)}")print("———— 结束 ————")

Python怎么实现文件自动去重Python怎么实现文件自动去重

附:

(2)用正则表达式来分行

import re # (2)正则分行 二进制的话要加b, b''' '''regx = '''[\w\~`\!\@\#\$\%\^\&\*\(\)\_\-\+\=\[\]\{\}\:\;\,\.\/\<\>\?]+'''lines = re.findall(regx, data)

2. 按md5比较

import hashlibimport os#-- from u_工具 import *print("———— 开始 ————")#-- 打点() # 用来配置的变量输入目录 = "./a_输入"输出目录 = "./b_输出"输出文件 = f"{输出目录}/去重结果.txt" # 预处理# 目录不存在就手动建立if not os.path.exists(输出目录):    os.makedirs(输出目录)if not os.path.exists(输入目录):    os.makedirs(输入目录)#-- 输出文件 = 文件名防重_追加数字(输出文件) # 获取待去重文件待去重文件列表 = [f"{输入目录}/{i}" for i in os.listdir(输入目录)]#-- 待去重文件列表 = []#-- getDeepFilePaths(待去重文件列表,输入目录,"txt")print(f"\n总共{len(待去重文件列表)}个文件") def gen_md5(data):    md5 = hashlib.md5()    if repr(type(data)) == "<class 'str'>":        data = data.encode('utf-8')    md5.update(data)    return md5.hexdigest() # 实际处理md5集 = set()with open(输出文件, "a") as f_rst:    文件个数 = 0    for 文件 in 待去重文件列表:        文件个数 += 1        print(f"\n处理第{文件个数}个文件")         # 计算总行数        with open(文件, 'rb') as f:            行数 = 0            buf_size = 1024 * 1024            buf = f.read(buf_size)            while buf:                行数 += buf.count(b'\n')                buf = f.read(buf_size)         # 读取、分行、去重、写入        #-- 打点()        i = 0        for line_带换行 in open(文件):            i += 1            line = line_带换行.strip()            md5值 = gen_md5(line)            if md5值 not in md5集:                md5集.add(md5值)                f_rst.write(line_带换行)             百分比 = i / 行数 * 10            if 百分比 == int(百分比):                print(f"已完成{int(百分比)*10}%")                #-- 打点()                #-- print(f"耗时:{计时()}") print(f"\n输出文件:{输出文件}") #-- 打点()#-- print(f"\n\n总耗时:{计时(0)}")print("———— 结束 ————")

Python怎么实现文件自动去重

三、二路归并

import hashlibimport osimport platformimport queueimport shutilfrom uuid import uuid1from u_工具 import * print("———— 开始 ————")打点() # 1.用来配置的变量输入目录 = "./a_输入"输出目录 = "./b_输出"输出文件 = f"{输出目录}/去重结果.txt"临时目录 = "./c_临时"小文件大小 = 50 * 1024 * 1024  # 50M # 2.预处理# 目录不存在就手动建立if not os.path.exists(输出目录):    os.makedirs(输出目录)if not os.path.exists(输入目录):    os.makedirs(输入目录)if not os.path.exists(临时目录):    os.makedirs(临时目录)shutil.rmtree(临时目录)os.makedirs(临时目录)输出文件 = 文件名防重_追加数字(输出文件) # 获取待去重文件# 待去重文件列表 = [f"{输入目录}/{i}" for i in os.listdir(输入目录)]待去重文件列表 = []getDeepFilePaths(待去重文件列表,输入目录,"txt")print(f"总共{len(待去重文件列表)}个文件") 换行符 = b"\n"if platform.system().lower() == 'windows':    换行符 = b"\r\n" # 3.实际处理 # (1)分割大文件打点()待排序文件列表 = []待补全数据 = b""for 文件 in 待去重文件列表:    with open(文件, 'rb') as f:        buf = f.read(小文件大小)        while buf:            data = buf.split(换行符,1)            新路径 = f"{临时目录}/无序_{序号(1)}_{uuid1()}.txt"            with open(新路径, 'ab') as ff:                ff.write(待补全数据 + data[0])            待排序文件列表.append(新路径)            try:                待补全数据 = data[1]            except:                待补全数据 = b""            buf = f.read(小文件大小)    新路径 = f"{临时目录}/无序_{序号(1)}_{uuid1()}.txt"    with open(新路径, 'ab') as ff:            ff.write(待补全数据 + 换行符)            待排序文件列表.append(新路径)    待补全数据 = b""del buf,data,待补全数据打点()print(f"\n分割大文件完成,共耗时:{计时()}") # (2)排序小文件打点()序号_重置(1)待归并文件队列 = queue.Queue()for 文件 in 待排序文件列表:    with open(文件, "rb") as f:        data = f.read()    data = set(data.split(换行符))    if b"" in data:        data.remove(b"")    if 换行符 in data:        data.remove(换行符)    data = sorted(data)     新路径 = f"{临时目录}/有序_{序号(1)}_{uuid1()}.txt"    with open(新路径, 'ab') as ff:        for line in data:            ff.write(line + 换行符)    待归并文件队列.put(新路径)    os.remove(文件)del data打点()print(f"\n排序小文件完成,共耗时:{计时()}") # (3)归并小文件打点("归并前")序号_重置(1)个数 = 待归并文件队列.qsize()归并次数 = 个数 - 1print(f"\n\n归并共{归并次数}次")当前次数 = 0while 个数 > 1:    当前次数 += 1    print(f"\n执行第{当前次数}次归并")    文件路径a = 待归并文件队列.get()    文件路径b = 待归并文件队列.get()    新文件路径 = f"{临时目录}/{序号(1)}_{uuid1()}.txt"    if 当前次数 == 归并次数:        新文件路径 = 输出文件    with open(文件路径a,"rb") as 文件a, open(文件路径b,"rb") as 文件b, open(新文件路径,"wb") as ff:        # region 归并操作        is_a_over = False        is_b_over = False         a = 文件a.readline().strip()        b = 文件b.readline().strip()        last = None         while not (is_a_over and is_b_over):             if is_a_over:                b = 文件b.readline()                if not b:                    is_b_over = True                else:                    ff.write(b)             elif is_b_over:                a = 文件a.readline()                if not a:                    is_a_over = True                else:                    ff.write(a)             else:                # region 处理初始赋值                if not a:                    is_a_over = True                    if not b:                        is_b_over = True                        continue                    else:                        ff.write(b + 换行符)                        continue                 if not b:                    is_b_over = True                    ff.write(a + 换行符)                    continue                # endregion                 if a <= b:                    if a == b or a == last:                        a = 文件a.readline().strip()                        if not a:                            is_a_over = True                            ff.write(b + 换行符)                        continue                    else:                        last = a                        ff.write(last + 换行符)                        a = 文件a.readline().strip()                        if not a:                            is_a_over = True                            ff.write(b + 换行符)                        continue                else:                    if b == last:                        b = 文件b.readline().strip()                        if not b:                            is_b_over = True                            ff.write(a + 换行符)                        continue                    else:                        last = b                        ff.write(last + 换行符)                        b = 文件b.readline().strip()                        if not b:                            is_b_over = True                            ff.write(a + 换行符)                        continue        # endregion     待归并文件队列.put(新文件路径)    os.remove(文件路径a)    os.remove(文件路径b)    个数 = 待归并文件队列.qsize()    打点()    print(f"耗时:{计时()}") 打点("归并后")print(f"\n\n归并小文件完成,共耗时:{计时('归并前','归并后')}")print(f"\n输出文件:{输出文件}") 打点()print(f"\n\n总耗时:{计时(0)}")print("———— 结束 ————")

Python怎么实现文件自动去重

以上是“Python怎么实现文件自动去重”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网Python频道!

--结束END--

本文标题: Python怎么实现文件自动去重

本文链接: https://www.lsjlt.com/news/278944.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python怎么实现文件自动去重
    这篇文章主要介绍Python怎么实现文件自动去重,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Python 文件自动去重平日里一来无聊,二来手巧,果然下载了好多无(luan)比(qi)珍(ba)贵(zao)的资料,搞...
    99+
    2023-06-15
  • Python 如何实现文件自动去重
    Python 文件自动去重 平日里一来无聊,二来手巧,果然下载了好多无(luan)比(qi)珍(ba)贵(zao)的资料,搞得我小小的硬盘(已经扩到6T了)捉襟见肘, 有次无意间,发...
    99+
    2022-11-12
  • 如何实现Python文件去重
    这篇文章将为大家详细讲解有关如何实现Python文件去重,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。代码ing导出的文件都是保存在同一文件夹下的,格式也相同。然后,上网查了下 filecmp.cmp()...
    99+
    2023-06-20
  • 8行代码实现Python文件去重
    目录需求描述撸代码ing需求描述 上周突然接到一个任务,要通过XX网站导出XX年-XX年之间的数据,导出后的文件名就是对应日期,导出后发现,竟然有的文件大小是一样,但文件名又没有重复...
    99+
    2022-11-12
  • python怎么实现自动整理文件
    本篇内容介绍了“python怎么实现自动整理文件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!演示效果:使用前使用后代码:# #&...
    99+
    2023-06-29
  • python如何实现MD5进行文件去重
    本篇内容主要讲解“python如何实现MD5进行文件去重”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python如何实现MD5进行文件去重”吧!目录前言工作原理代码前言工作中偶尔会遇到文件去重...
    99+
    2023-06-20
  • Python列表去重怎么实现
    可以通过使用set()函数,将列表转换为集合,实现列表去重。例如:lst = [1, 2, 3, 3, 4, 5, 5]new_ls...
    99+
    2023-10-20
    Python
  • Python中怎么实现自动化处理文件
    Python中怎么实现自动化处理文件,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。遍历一个目录中的文件如果有如下多个数据需要读取和处理:├── data ...
    99+
    2023-06-15
  • python实现自动整理文件
    前言: 平时工作没有养成分类的习惯,整个桌面杂乱无章都是文档和资料,几乎快占满整个屏幕了。所以必须要整理一下了,今天我们来看下用python如何批量将不同后缀的文件移动到同一文件夹。...
    99+
    2022-11-10
  • ​Python爬虫怎么实现url去重
    这篇文章主要介绍“Python爬虫怎么实现url去重”,在日常操作中,相信很多人在Python爬虫怎么实现url去重问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python爬虫怎么实现url去重”的疑惑有所...
    99+
    2023-06-02
  • python实现自动清理文件夹旧文件
    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 由于程序一直在不停地存图,因此需要监测图片文件夹的大小,一旦超过指定大小则删除一部分最早的图片。...
    99+
    2022-11-12
  • python实现MD5进行文件去重的示例代码
    目录前言工作原理代码前言 工作中偶尔会遇到文件去重的事情,收到一大堆文件,名称各不相同,分析文件的时候发现有不少重复的文件,导致工作效率低下,那么,这里就写了一个python脚本实现文件去重功能 工作原理 脚本会检查...
    99+
    2022-06-02
    python MD5文件去重 python MD5去重
  • maven怎么自动去掉重复依赖
    在 Maven 中,可以通过配置 `` 元素来自动去掉重复依赖。 打开项目的 `pom.xml` 文件。 在 `` 元素的下方添加...
    99+
    2023-10-27
    maven
  • python实现自动下载sftp文件
    本文实例为大家分享了python实现自动下载sftp文件的具体代码,供大家参考,具体内容如下 实现功能:利用python自动连接sftp,并下载sftp中指定目录下的所有目录及文件 ...
    99+
    2022-11-12
  • Shell中怎么实现文本去重操作
    这期内容当中小编将会给大家带来有关Shell中怎么实现文本去重操作,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。代码如下:ccccaaaabbbbddddbbbbccccaaaa现在需要对它进行去重处理,...
    99+
    2023-06-09
  • 怎么用Python制作一个文件去重小工具
    这篇文章主要讲解了“怎么用Python制作一个文件去重小工具”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Python制作一个文件去重小工具”吧!前言常常在下载网络素材时有很多的重复文...
    99+
    2023-06-29
  • python实现自动化之文件合并
    假如公司需要统计每个员工的个人信息,制定好模板后,由员工填写,然后发送到综合部进行汇总,在这种情况下,如果公司有上百位员工的信息需要统计,且采用纯手工进行复制粘贴的方式进行汇总,则将是一项耗时费力易错的工作。本文主要...
    99+
    2022-06-02
    python 文件合并
  • Python实现批量自动整理文件
    为了实现这样的小工具,我们先设想有下面这些功能。 1、可以自定义整理某一个路径下面的所有需要被整理的文件。2、默认情况下,使用文件后缀作为同一种类文件的文件夹名称,有其他想法的小伙伴...
    99+
    2022-11-13
  • Python中怎么实现列表去重复项
    Python中怎么实现列表去重复项,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。方式## 1. 新建列表,如果新列表中不存在,则添加到新列表。 ...
    99+
    2023-06-16
  • Python中怎么自动下载文件
    本篇文章给大家分享的是有关Python中怎么自动下载文件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。import os   import&nbs...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作