文件的实战题目来了,稍微有点小综合,不过相信老鸟们都能轻松搞定!对于零基础的同学,难度还好,需要综合前面几章的知识。
假如我们有一个目录里面包含若干个文件和子目录:
问题1:我们要统计该目录下有多少个文件并显示出来(包含子目录)
问题2:该目录总共的大小可以按M,也可以按K显示
问题3:该目录下最大的文件和最小的文件,以及对应的大小
我的目录是:F:\windownshare\Python-3.7.2
def get_size(path):
global sum
file=os.listdir(path)
for i,j in enumerate(file):
print(j)
if os.path.isdir(os.path.join(path,j))==True:
get_size(os.path.join(path,j))
else:
size=os.path.getsize(os.path.join(path,j))
print('------')
print(j)
print(size)
print('------')
sum = sum + size
print('----------u-')
print('该目录大小为:',sum/1024**2,'M')
def find_max(path):
file = os.listdir(path)
max=0
for i, j in enumerate(file):
if os.path.isdir(os.path.join(path, j)) == True:
continue
else:
size = os.path.getsize(os.path.join(path, j))
if size>max:
max=size
flag=i
print("最大的是:"+file[flag])
def find_min(path):
file = os.listdir(path)
min=100000000000000000000000
for i, j in enumerate(file):
if os.path.isdir(os.path.join(path, j)) == True:
continue
else:
size = os.path.getsize(os.path.join(path, j))
if size < min:
min = size
flag = i
print("最小的是:" + file[flag])
def list_file(path):
file = os.listdir(path)
for index,value in enumerate(file):
print(index+1,value)
if __name__ == '__main__':
sum=0
size=0
addresspath = 'F:/windownshare/Python-3.7.2' #改地址为要查询目录地址
get_size(addresspath) #获取大小
find_max(addresspath) #最大文件
find_min(addresspath) #最小文件
list_file(addresspath) #遍历目录
在这里插入图片描述
星主的代码:(理解中)
import os
import time
def get_file_size(file): #定义获取文件大小的函数
if os.path.exists(file): #检查路径是否真的存在
return os.path.getsize(file) #返回文件大小
else:
print('路径错误')
return 0
def statist_files(path): #统计文件
files=[] #定义一个列表存放文件
for dirpath,dirname,filename in os.walk(path):
for file_name in filename:
files.append(os.path.join(dirpath,file_name))#将所有目录中所有路径名结合文件名放在files的列表里
return [{'name':f,
'size':get_file_size(f)} for f in files] #!!!将files列表里的全部遍历出来
def count_files_size(files_info,size_dispaly_mode='M'):
sizes=[file_info.get('size',0)for file_info in files_info]
if size_dispaly_mode=='k' or size_dispaly_mode=='K':
return str(round(sum(sizes)/1024,3))+'k' #round函数是一个用于四舍五入的函数,其中3表示保留三位小数 sum函数是将sizes中的相加
elif size_dispaly_mode=='m' or size_dispaly_mode=='M':
return str(round(sum(sizes)/(1024*1024),3))+'M'
elif size_dispaly_mode=='g' or size_dispaly_mode=='G':
return str(round(sum(sizes)/(1024*1024*1024),3))+'G'
else:
return str(round(sum(sizes)))+'byte'
def get_sorted_files(files):
sorted_files=sorted(files,key=lambda x:x['size'],reverse=True)# 颠倒是从大到小
return sorted_files
def cost_time(fun):
def warp():
start=time.time()
fun()
print(f'\ncost time:{time.time()-start}')
return warp()
def main():
print('start searching...')
path='F:/windownshare/Python-3.7.2'
files_info=statist_files(path)
print('Total files nums:',len(files_info))
print('Total files size:',count_files_size(files_info,size_dispaly_mode='M'))
sorted_files=get_sorted_files(files_info)
print(f'Max file:{sorted_files[0]}')
print(f'Min file {sorted_files[-1]}')
if __name__ == '__main__':
main()