python12-放飞

zjj
492 号测试 成员, 2018-11-28 12:03:35 加入
1.7k
个人主页浏览
  • 20181205Python 自动化笔试题,挑战你的知识库

    2020-07-24 10:55
    
    # -*- coding:utf-8 -*-
    
    import os
    import hashlib
    
    FILE_LIST = [] #所有文件列表
    
    #获取目录下所有文件
    def  get_file_list(dir_path):
        global FILE_LIST
        dir_list = {}
        if not os.path.isdir(dir_path):
            print('目录不存在')
        else:
            dir_list = os.listdir(dir_path)
            for file in dir_list:
                file_path = dir_path + '\\' +file
                if os.path.isdir(file_path):
                    get_file_list(file_path) #目录包含目录需读得里面的文件
                else:
                    FILE_LIST.append(file_path)
        #print(FILE_LIST)
    
    #获取文件的md5的值
    def get_file_md5(file_path):
        def read_chunks(fh):
            fh.seek(0)
            chunks = fh.read(8096)  #文件过大一块块读
            while chunks:
                yield chunks
                chunks = fh.read(8096)
            else: #最后将游标放回到文件头
                fh.seek(0)
    
        myhash = hashlib.md5()
        with open(file_path,'rb') as fh:
            for chunk in read_chunks(fh):
                myhash.update(chunk)
    
        return myhash.hexdigest()
    
    
    #文件大小过滤及重命名
    def file_operator(dir_path,size,file_size_unit):
        count = 0
        file_dict = {}
        get_file_list(dir_path) #获取目录下所有文件
    
        for file in FILE_LIST:
            file_size = os.path.getsize(file)
            if file_size_unit == 'Byte':
                file_size = file_size
            elif file_size_unit == 'KB':
                file_size = file_size / 1024
            elif file_size_unit == 'M':
                file_size = file_size / 1024 / 1024
            elif file_size_unit == 'G':
                file_size = file_size / 1024 / 1024 / 1024
            else:
                print('文件单位默认为M处理')
                ile_size = file_size / 1024 / 1024
    
            file_size = round(file_size,2)
            file_md5 = get_file_md5(file)   #获取文件的md5码
            file_path = os.path.split(file)
            file_full_name = file_path[1]  #获取文件的名称,不包含目录
            count += 1
            file_type = file_full_name[file_full_name.index('.'):] #获取文件的类型
            #新目录名 = 目录+文件+文件md5码+记数+文件类型
            new_name = file_path[0] + '\\' + str(file_md5) + '_' + str(count) + file_type
            os.rename(file,new_name)
            if(file_size > size): #过滤文件大小不足的
                file_dict[new_name] = str(file_size) + file_size_unit
    
        print('大小超过{0}{1}的文件列表为:\n{2}'.format(size,file_size_unit,file_dict))
    
    if __name__ == '__main__':
        file_operator(r'G:\test',10,'M')