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

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

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())
    
    
  • 其他回帖
  • D_Sai
    import os
    import hashlib
    
    class MyFile:
        '''文件夹类'''
    
        def __init__(self, myPath):
            self.rootPath = myPath
    
        def del_files(self):
            '''遍历文件夹'''
            for root, dirs, files in os.walk(self.rootPath):#逐层遍历文件夹
                for file in files:#遍历每一个文件
                    File1.append(os.path.join(root, file))#每一个文件放在总的列表下
                    fileSize = os.path.getsize(os.path.join(root, file))
                    if fileSize >= 10*1024*1024:
                        File2.append(os.path.join(root, file))
            #文件名去重
            for item in File1:
                if item not in File3:
                    md = self.get_file_md5(item)
                    File3.append(item)
                else:
                    self.get_file_md5(item)
                    File4.append(md)
    
        def get_file_md5(slef, filename):
            '''得到每个文件的md5'''
            md5 = None
            if os.path.isfile(filename):
                f = open(filename, "rb")
                fileMd5 = hashlib.md5()
                fileMd5.update(f.read())
                hashCode = fileMd5.hexdigest()
                f.close()
                md5 = str(hashCode).lower()
                return md5
            else:
                print("这不是一个文件,请重新确认路径。")
                return
    
    
    if __name__ == '__main__':
        File1 = []  # 获取所有带路径文件名
        File2 = []  # 获取大于10M的带路径文件名
        File3 = []  # 获取去重后的带路径文件名
        File4 = []  # 存放重复名字md5
        myFile = MyFile(r'C:\Users\admin\Desktop\柠檬班书籍')
        myFile.del_files()
        print("File1:", File1)
        print("File2", File2)
        print("File3", File3)
        print("File4", File4)
    
  • tyq
    import os,hashlib
    md5_list=[]
    class GetFile:
        def get_md5(self,file):
            if os.path.isfile(file):
                f = open(file,'rb')
                md5_obj = hashlib.md5()#获取一个md5加密算法对象
                md5_obj.update(f.read())#读取文件,制定需要加密的字符串
                hash_code = md5_obj.hexdigest()#获取加密后的16进制字符串
                f.close()
                md5=str(hash_code).lower()#转为小写
                return md5
        def alter_file(self,directory):
            list_dir=os.listdir(directory)#获取指定目录下的文件
            for item in list_dir:#遍历目录下的文件
                files_md5=self.get_md5(item)
                md5_list.append(files_md5)
                md5_set=set(md5_list)
                for i in md5_set:
                #判断md5个数是否大于1,做去重
                  if md5_list.count(i)>1 and os.path.getsize(item)>10*pow(1024,2):#判断文件的大小是否大于10M
                    file=os.path.splitext(item)#将文件拆成文件名和后缀
                    file_new=files_md5+file[1]#命名一个新文件
                    try:
                        os.rename(item,file_new)#文件替换
                        print("符合的文件有{0},修改为{1}".format(item,file_new))
                    except FileExistsError as e:
                        print(e)
                    break
    if __name__ == '__main__':
        #指定一个目录
        path="F:\Python\python"
        GetFile().alter_file(path)
    
  • 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#保证改名后,文件的后缀名字不变
                    new_pathname = 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 
    
  • 查看更多回帖