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

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

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

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

温馨提示:

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

    虽然好多写答案的了,还是把自己写的代码贴上来,毕竟写了很久。虽然判断重名的还没有实现

    import os
    import hashlib
    
    class Test:
        #获取文件对应的md5
        def get_md5(self,path,file_name):
            with open(os.path.join(path,file_name),'rb') as f:
                md5obj=hashlib.md5()
                md5obj.update(f.read())
                hash=md5obj.hexdigest()
            return hash
    
        #获取文件大小的函数,默认获取到的单位是byte
        def get_size(self,file_path):
            fsize=os.path.getsize(file_path)
            fmz=fsize/1024                   #转换为kb
            return round(fmz,2)
    
        #过滤重名文件并重命名
        def rename(self,path):
            list = []  # 定义一个空列表用来存放文件名
            i = 1  # 重名文件-文件名自增
            for root, dirs, files in os.walk(path):
                for file in files:
                    if file not in list:  # 判断文件名是否已经在列表中,如果不在,则直接追加
                        list.append(file)
                    else:  # 如果在,则重命名后追加
                        new_name = "test000" + str(i) + ".py"  # 新文件名命名组合
                        os.rename(file, new_name)
                        list.append(new_name)
                        i += 1
                        # print("每一次的list是{}".format(list))
            return list  # 返回重命名后的文件集合
    
        # 获取目录下的所有文件,并调用get——md5函数
        def allfile(self,basepath):
            # 判断是否有重名文件并重命名,调用rename函数
            self.rename(basepath)
            list1=[]
            for root,dirs,files in os.walk(basepath):
                for file in files:
                    #获取文件的大写
                    fsize=self.get_size(os.path.join(root,file))
                    if fsize>1:                                     #如果文件大于1kb,则修改名称
                        md5_name = self.get_md5(root, file)+".py"  #md5名字:root:文件对应目录;file:文件名
                        os.rename(file,md5_name)                    #将大于1kb的文件重命名
                        print("符合条件的所有文件是{},文件大小是{}kb".format(file,fsize))
                    else:
                        # print("文件{}太小,大小是{}byte".format(file,fsize))
                        list1.append(file)
            print("小于1kb的文件集合是{}".format(list1))
    
    
    if __name__ == '__main__':
        path=os.getcwd()
        Test().allfile(path)
    
    

    1)一共4个方法:过滤重名文件并重命名,获取文件对应的MD5,获取文件大小,获取文件列表(判断大小&重命名)
    2)主要用到了os库中的 os.path.getsize(), walk(), os.path.join(), os.rename() 函数。中间使用了for循环和if判断
    3)关于获取文件md5的代码是直接在网上搜的,自己看不太明白。

  • 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())
    
    
  • 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)

  • 查看更多回帖