20181205Python 自动化笔试题,挑战你的知识库

本贴最后更新于 1563 天前,其中的信息可能已经时移俗易

1:获取当前目录下所有文件,然后做如下处理:

  1. 文件名去重复。
  2. 选出文件大于10m的
  3. 获取到文件的md5值,然后利用这个md5值对文件名进行重命名(其中md5代表一个文件属性)
  4. 打印出最后的符合条件的所有文件名

温馨提示:

  1. 我们是要获取所有的文件 而不是目录
  2. 去重复不是删除文件,而是对重复的文件名进行重命名
  3. 想办法获取文件的md5值
  4. 最好是函数的形式实现哦
1 操作
huahua 在 2020-08-07 21:52:58 更新了该帖
18 回帖
请输入回帖内容 ...
  • liangwuliu062
    
    

    mport os
    import hashlib

    def filename_distinct(file_path):
    #获取目录下的所有文件并去重
    files=[]
    for root, dirs, file in os.walk(file_path):
    '''file为循环遍历的每一个目录下的文件,存储为列表形式'''
    files+=file #每个文件夹下的文件名列表相加,获取所有文件
    #对所有文件名去重并重命名重复的文件名,循环遍历,两两对比
    for i in range(len(files)-1):
    for j in range(i,len(files)-1):
    if files[i]==files[j+1]: #如果文件名重复
    '''为重复的文件名中的一个重命名,加上循环遍历的i,j保证重命名后文件名不会再重复'''
    files[i]=str(i)+str(j)+files[i]
    # print('所有文件名——去重后:',files)
    return files

    def file_md5(file_path):
    #获取文件的md5属性
    if os.path.isfile(file_path):
    fp = open(file_path, 'rb')
    contents = fp.read()
    fp.close()
    md5_1 = hashlib.md5(contents).hexdigest()
    else:
    print('file not exists')
    return md5_1

    def get_big_file(file_path,size):
    #获取大于指定size的文件,单位为M
    big_file=[]
    for fpathe,dirs,fs in os.walk(file_path): #遍历目录下的所有文件
    for f in fs:
    file_path=os.path.join(fpathe,f) #文件的绝对路径
    if os.path.getsize(file_path)>10241024size:
    big_file.append(file_path) #获取到大于10M的文件绝对路径列表
    return big_file

    if name == 'main':
    file_path='C:\Users\liang\Desktop\新建文件夹'
    bigfile=get_big_file(file_path,10)
    print(filename_distinct(file_path))
    print(bigfile)
    md5file=[]
    for file_name in bigfile:
    md5file.append(file_md5(file_name))
    print(md5file)

  • 其他回帖
  • zjj
    
    # -*- 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')
    
  • emma
    import os
    import hashlib
    def get_md5(file_path):#计算md5值
        with open(file_path, 'rb') as f:
            md5 = hashlib.md5()
            while True:
                b=f.read(8096)#分段读取
                if not b:
                    break   #如果读取结束了就跳出循环
                md5.update(b)
            hash = md5.hexdigest()
        return hash   #返回文件的md5值
    
    file_list = []
    new_file=[]
    name=[]
    def find_file(path): #获取所有的文件,并筛选出大于10M的文件
        if os.path.isdir(path)==True:
            for items in os.listdir(path):
                new_path=os.path.join(path,items)
                find_file(new_path)
        else:
            if os.path.getsize(path) >=10*1024*1024:
                file_list.append(path)
        return file_list
    
    
    
    def find_name(file): #找到重名的文件并修改
        new_path=[]
        name=[]
        for items in file:
            name.append(os.path.split(items))
        for i in range(len(name)-1):
            for j in range(i+1,len(name)):
                if name[i][-1]==name[j][-1]:
                    new_path.append(os.path.join(name[i][0],name[i][-1]))
                    new_path.append(os.path.join(name[j][0],name[j][-1]))
        for items in new_path: #new_path里面是所有重名的文件路径集合
            md5=get_md5(items)
            file=os.path.split(items)[-1]#获取文件名
            newname=md5+'.'+file.split('.')[-1]#拼接新文件名
            os.rename(items,os.path.join(os.path.split(items)[0],newname)) #重命名
    
    path=os.getcwd()
    print(path)
    file=find_file(path)
    find_name(file)
    
  • liangwuliu062
    
    import os
    import hashlib
    
    def filename_distinct(file_path):
        #获取目录下的所有文件并去重
        files=[]
        for root, dirs, file in os.walk(file_path):
            '''file为循环遍历的每一个目录下的文件,存储为列表形式'''
            files+=file  #每个文件夹下的文件名列表相加,获取所有文件
        #对所有文件名去重并重命名重复的文件名,循环遍历,两两对比
        for i in range(len(files)-1):
            for j in range(i,len(files)-1):
                if files[i]==files[j+1]:  #如果文件名重复
                    '''为重复的文件名中的一个重命名,加上循环遍历的i,j保证重命名后文件名不会再重复'''
                    files[i]=str(i)+str(j)+files[i]
        # print('所有文件名——去重后:',files)
        return files
    
    def file_md5(file_path):
        #获取文件的md5属性
        if os.path.isfile(file_path):
            fp = open(file_path, 'rb')
            contents = fp.read()
            fp.close()
            md5_1 = hashlib.md5(contents).hexdigest()
        else:
             print('file not exists')
        return md5_1
    
    def get_big_file(file_path,size):
        #获取大于指定size的文件,单位为M
        big_file=[]
        for fpathe,dirs,fs in os.walk(file_path):   #遍历目录下的所有文件
            for f in fs:
                file_path=os.path.join(fpathe,f)  #文件的绝对路径
                if os.path.getsize(file_path)>1024*1024*size:
                    big_file.append(file_path)  #获取到大于10M的文件绝对路径列表
        return big_file
    
    if __name__ == '__main__':
        file_path='C:\\Users\\liang\\Desktop\\新建文件夹'
        bigfile=get_big_file(file_path,10)
        print(filename_distinct(file_path))
        print(bigfile)
        md5file=[]
        for file_name in bigfile:
            md5file.append(file_md5(file_name))
        print(md5file)
    
    ```python
    
    
  • 查看更多回帖