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

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

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

温馨提示:

  1. 我们是要获取所有的文件 而不是目录
  2. 去重复不是删除文件,而是对重复的文件名进行重命名
  3. 想办法获取文件的 md5 值
  4. 最好是函数的形式实现哦
1 操作
huahua 在 2020-08-07 21:52:58 更新了该帖
18 回帖
请输入回帖内容 ...
  • Monica711
    # -*- coding: utf-8 -*-
    # @Time  : 2018/12/5 10:21
    # @Author : Monica
    # @Email : 498194410@qq.com
    # @File  : os_practice.py
    
    import os
    import hashlib
    
    allfiles = []
    templist = {}
    end_file = []
    
    
    class GetFlie:
        def __init__(self, dirpath):
            self.dirpath = dirpath
    
        def get_all_file(self):
            # 通过os.walk获取目录下的所有文件名
            for root, dirs, files in os.walk(self.dirpath):
                for file in files:
                    # 判断size
                    size = os.path.getsize(os.path.join(root, file))
                    if size >= 10485760:
                        # 文件名添加到allfiles列表里
                        allfiles.append(os.path.join(root, file))
            # 重命名
            for i in range(len(allfiles)):
                # 如果md5在字典的key已存在
                if self.get_md5(allfiles[i]) in templist.keys():
                    templist[self.get_md5(allfiles[i]) + str(i)] = allfiles[i].split(".")[0] + str(i) + "." + allfiles[i].split(".")[-1]
                else:
                    templist[self.get_md5(allfiles[i])] = allfiles[i]
            # 最后的文件
            for file in templist.values():
                end_file.append(file)
    
            return end_file
    
        @staticmethod
        def get_md5(filename):
            f = open(filename, 'rb')
            m1 = hashlib.md5()
            m1.update(f.read())
            hash_code = m1.hexdigest()
            f.close()
            md5 = str(hash_code).lower()
            return md5
    
    if __name__ == '__main__':
        path = r'I:\lesson_practice\tool'
        print(GetFlie(path).get_all_file())
    
    
  • 其他回帖
  • 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)
    
  • python12-wangbo
    import os,hashlib
    class get_file():
        def __init__(self,path):
            self.path=path
            """path 通过传入制定路径,获取路径下的所有文件名字返回一个1维列表"""
            self.file_name=[]
            for (dirpath, dirnames, filenames) in os.walk(self.path):
                if  filenames:
                    self.file_name.append(filenames)
            self.old_file_name=[]
            for i in self.file_name:
                for j in i:
                    self.old_file_name.append(j)
            self.old_file_name
            print("old_file       ",self.old_file_name)
            
        def count_file(self,filename):
            count=0
            for  i  in self.old_file_name:
                if filename ==i:
                    count=count+1
            return count
        def getBigFileMD5(self,filepath):
            """获取文件的md5值,防止因为文件过大而发生读取错误,采用分段读取"""
            if os.path.isfile(filepath):
                file_md5 = hashlib.md5()
                maxbuf = 8192          #设置每次读取的字节数
                f = open(filepath,'rb')
                while True:
                    buf = f.read(maxbuf)  
                    if not buf:
                        break          #每次读取设置的字节数大小,直到读完后跳出循环    
                    file_md5.update(buf)   #用数据中的字节更新哈希对象,重复调用相当于链接起来
                f.close()      
                hash = file_md5.hexdigest()
                return str(hash).upper()
            return None 
            
        def unique_absfile(self):
            """判断文件名在所有文件的列表中出现的次数,大于1则更改文件名字为md5值,并且保留后缀名字,
            方法返回处理后的文件名字(绝对路径)的列表"""
            pathname=[]
        
            for (dirpath, dirnames, filenames) in os.walk(self.path):   
                 
                for filename in filenames: 
                    if self.count_file(filename)>1: #判断文件名字是否重复
                        file_first_name=filename.split(".")[0]
                        file_last_name=filename.split(".")[1] 
                        path_name=os.path.join(dirpath, filename)  #获取重复文件名字的绝对路径
                        
                        new_filename=self.getBigFileMD5(path_name)+"."+file_last_name#保证改名后,文件的后缀名字不变
                         os.path.join(dirpath, new_filename)
                        
                        new_pathname=os.rename(path_name,new_pathname)
                        pathname=pathname+[new_pathname ]
                    else:
                        pathname=pathname+[os.path.join(dirpath, filename)]
            return pathname 
        def file_size(self,condition=10):
            """调用内部方法self.unique_absfile(),获得去重后的文件名字列表(文件名是绝对路径)"""
            """获取文件大小,以M为单位"""
            all_file=self.unique_absfile()
            file_name=[]
            for i in   all_file:
                size = float((os.path.getsize(i)/1024))
                if size>condition:
    
                    if "\\" in i:
                       file_name.append(i.split("\\")[-1]) 
                    else:
                        file_name.append(i.split("/")[-1]) 
            return file_name
    
  • 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)

  • 查看更多回帖