zoukankan      html  css  js  c++  java
  • Python合并两Excel表格并写入新表格,数据加工统计 ,Python查询目录下所有重复文件并输出路径和名字

    (1)查找硬盘中的所有重复文件,并列出每组重复文件中每个文件的文件名、文件大小、位置和创建日期【不是重名文件!!用md5值判断是否是相同文件】

    import hashlib
    import os
    from collections import Counter
    import time
    import datetime
    
    def get_md5_01(file_path):
        md5 = None
        if os.path.isfile(file_path): #防止报错,存在该文件时才读取
            f = open(file_path, 'rb')#二进制模式读取文件
            md5_obj = hashlib.md5() #创建hash对象,md5:(message-Digest Algorithm 5)消息摘要算法,得出一个128位的密文
            md5_obj.update(f.read())#更新哈希对象,以字符串为参数 ,此处为读入的文件内容
            hash_code = md5_obj.hexdigest()#返回摘要,作为十六进制数据字符串值    23eeeb4347bdd26bfc6b7ee9a3b755dd
            f.close()
            md5 = str(hash_code).lower()#计算的md5值变为小写
        return md5
    
    #
    # def get_md5_02(file_path):
    #     f = open(file_path, 'rb')
    #     md5_obj = hashlib.md5()
    #     while True:
    #         d = f.read(8096)
    #         if not d:
    #             break
    #         md5_obj.update(d)
    #     hash_code = md5_obj.hexdigest()
    #     f.close()
    #     md5 = str(hash_code).lower()
    #     return md5
    
    def TimeStampToTime(timestamp):
        timeStruct = time.localtime(timestamp)
        return time.strftime('%Y-%m-%d %H:%M:%S',timeStruct)
    def get_FileSize(filePath):
        fsize = os.path.getsize(filePath)#文件大小,字节为单位,转换成兆
        fsize = fsize/float(1024*1024)
        return round(fsize,2)
    def get_FileCreateTime(filePath):
        t = os.path.getctime(filePath)
        return TimeStampToTime(t)
    
    if __name__ == "__main__":
        output_list = []
        output_path = os.getcwd()#返回当前工作目录
        print(output_path)
        g = os.walk(output_path)#返回当前目录的路径,文件夹名(目录列表),文件列表
        for path, dir_list, file_list in g:#遍历顺序以目录树的形式,不断递归到更深层的文件夹内
            print(dir_list,'----->')
            print(file_list)
            for file_name in file_list:
                output_list.append(os.path.join(path, file_name))#输出文件路径和文件名,并将主目录路径和文件列表组合成完整路径,将每个文件组装好的路径放入output列表中
        md5_list = [get_md5_01(i) for i in output_list]#对所有文件求md5值,并存在列表中
        Counter_list = Counter(md5_list)#该函数直接对求得的所有md5值计数,并用字典标记每个md5值的出现次数
        print(Counter_list)
        for i in Counter_list.items():
            # print(type(i),i)#items()返回一个元组,表示dict的 键-值,[0]为键,[1]为值
            if i[1] > 1:#一个计数大于1的md5值说明重复出现
                duplicate_list = [a for a in range(len(md5_list)) if md5_list[a] == i[0]]#遍历所有md5值,符合条件的文件下标存下
                print(i[0])#中奖的md5值
                for j in duplicate_list:#将符合条件的文件信息输出
                    # with open('duplicate.log', mode='a+') as f:
                    #     f.write(i[0] +'	' + output_list[j] + '
    ')
                    print('文件路径',output_list[j])
                    print('文件大小',get_FileSize(output_list[j]), 'M')
                    print('文件创建时间',get_FileCreateTime(output_list[j]))
                    print('文件绝对路径',os.path.abspath(output_list[j]))
    
    
    

    (2)合并两个Excel文件中的数据,并将合并后的数据写入一个新的Excel文件。然后将五星~一星评价数转化为百分数的形式(只保留整数,不写百分号);统计8分以上和9分以上的书籍数目,以及两个分组(8分 分组和9分 分组)中5星和4星评价的平均值
    操作用到的两个表格名为:doubanbook-1.xlsx、doubanbook-2.xlsx
    生成的合并新表格为result_excel.xlsx
    在这里插入图片描述
    调用xlrd和xlsxwriter包实现,需要使用pip下载包

    运行结果:
    在这里插入图片描述

    #将多个Excel文件合并成一个
    import xlrd
    import xlsxwriter
    
    #打开一个excel文件
    def open_xls(file):
        fh=xlrd.open_workbook(file)
        return fh
    
    #获取excel中所有的sheet表
    def getsheet(fh):
        return fh.sheets()
    
    #获取sheet表的行数
    # def getnrows(fh,sheet):
    #     table=fh.sheets()[sheet]
    #     return table.nrows
    def changestart(x,y):
        return int(x/y*100)
    #读取文件内容并返回行内容
    def getFilect(file,shnum):
        fh=open_xls(file)#第fl个文档 的第shnum个表
        table=fh.sheets()[shnum]#第shnum个表
        num=table.nrows#得到行数
        for row in range(num):#遍历这个表的所有行
            tot=0
            rdata=table.row_values(row)#整行信息
            # print(rdata)
            if type(rdata[8])==float:
                if rdata[2]>=8:
                    global s84
                    s84+=rdata[5]
                    global s85
                    s85+=rdata[4]
                if rdata[2]>=9:
                    global s94
                    s94+=rdata[5]
                    global s95
                    s95+=rdata[4]
                for star in range(4,9):
                    tot+=rdata[star]
                for i in range(4,9):
                    rdata[i]=changestart(rdata[i], tot)
            datavalue.append(rdata)
        return datavalue#包含了该表中所有行信息
    
    #获取sheet表的个数
    def getshnum(fh):
        x=0
        sh=getsheet(fh)#所有表
        for sheet in sh:
            x+=1
        return x
    
    
    if __name__=='__main__':
        #定义要合并的excel文件列表
        allxls=['D:KuroNekoDesktop程序语言pythondoubanbook-1.xlsx','D:KuroNekoDesktop程序语言pythondoubanbook-2.xlsx']
        #存储所有读取的结果
        datavalue=[]
        global f8, f9, s84, s85, s94, s95
        f8=f9=s84=s85=s94=s95=0
        for fl in allxls:
            fh=open_xls(fl)#读入文档
            x=getshnum(fh)#统计表个数
            for shnum in range(x):
                print("正在读取文件:"+str(fl)+"的第"+str(shnum)+"个sheet表的内容...")
                rvalue=getFilect(fl,shnum)#读入表内容
        #定义最终合并后生成的新文件
        endfile='D:KuroNekoDesktop程序语言python\result_excel.xlsx'
        wb1=xlsxwriter.Workbook(endfile)# 建立合并结果文件
        #创建一个sheet工作对象
        ws=wb1.add_worksheet()#建表
        for a in range(len(rvalue)):  #遍历读入完所有文档所有表的列表,其中a为很多行,b为每行的内容
            for b in range(len(rvalue[a])):
                c=rvalue[a][b]
                if(b==2 and type(c)!=str):
                    if c>=8:f8+=1
                    if c>=9:f9+=1
                ws.write(a,b,c)#表的a行b列写入内容c
        wb1.close()
        print("文件合并完成")
        print('8分以上书籍数目:',f8)
        print('9分以上书籍数目:',f9)
        print('8分以上四星评价平均值:',s84/f8)
        print('8分以上五星评价平均值:',s85/f8)
        print('9分以上四星评价平均值:',s94/f9)
        print('9分以上五星评价平均值:',s95/f9)
    
  • 相关阅读:
    [高精度模板][Pascal]整数加、减、乘、除、开方等
    [poj2528]求最后未完全被其它线段覆盖的线段个数
    [POJ3468]线段树模板
    火车进出栈问题(强化版)
    手把手教上Getchu.com
    集合删数
    [SBT模板题]HNOI2002 营业额统计
    离散化Pascal模板
    hdu 4507 吉哥系列故事——恨7不成妻
    组合数学总结
  • 原文地址:https://www.cnblogs.com/kuronekonano/p/11135683.html
Copyright © 2011-2022 走看看