1:获取当前目录下所有文件,然后做如下处理:
- 文件名去重复。
- 选出文件大于10m的
- 获取到文件的md5值,然后利用这个md5值对文件名进行重命名(其中md5代表一个文件属性)
- 打印出最后的符合条件的所有文件名
温馨提示:
- 我们是要获取所有的文件 而不是目录
- 去重复不是删除文件,而是对重复的文件名进行重命名
- 想办法获取文件的md5值
- 最好是函数的形式实现哦
1:获取当前目录下所有文件,然后做如下处理:
温馨提示:
# -*- 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())
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
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
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
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)
# -*- 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')
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)
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
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)
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)
import os
import hashlib
import uuid
def get_all_file(file_path):
files = [ file for root,dir,files in os.walk(file_path) for file in files if os.path.getsize(os.path.join(root,file))>10485760]
md5_file_name = {get_md5(filename+str(uuid.uuid1())):filename for filename in files}
print(md5_file_name)
return files
def get_md5(filename_index):
secret = hashlib.md5()
secret.update(filename_index.encode("utf-8"))
return secret.hexdigest()
if __name__ == '__main__':
**print(get_all_file('filepath'))
虽然好多写答案的了,还是把自己写的代码贴上来,毕竟写了很久。虽然判断重名的还没有实现
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的代码是直接在网上搜的,自己看不太明白。
欢迎来到testingpai.com!
注册 关于