1:获取当前目录下所有文件,然后做如下处理:
- 文件名去重复。
- 选出文件大于10m的
- 获取到文件的md5值,然后利用这个md5值对文件名进行重命名(其中md5代表一个文件属性)
- 打印出最后的符合条件的所有文件名
温馨提示:
- 我们是要获取所有的文件 而不是目录
- 去重复不是删除文件,而是对重复的文件名进行重命名
- 想办法获取文件的md5值
- 最好是函数的形式实现哦
1:获取当前目录下所有文件,然后做如下处理:
温馨提示:
虽然好多写答案的了,还是把自己写的代码贴上来,毕竟写了很久。虽然判断重名的还没有实现
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的代码是直接在网上搜的,自己看不太明白。
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
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
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)
欢迎来到testingpai.com!
注册 关于