# 海量文件遍历

机器学习往往需要大量的数据来训练模型,因此对数据的处理肯定是不能少的,而数据往往很多,大多数以压缩文件.zip 出现的,所以本篇记录文件遍历的方法

# 一、所需要调用的库

  • zipfilezipfile

  • osos

# 二、具体代码、注释及效果图

import zipfile
import os
def unzip_data(src_path,target_path):
#解压原始数据集,将 src_path 路径下的 zip 压缩包解压到 target_path 目录下
    if (not os.path.isdir(target_path)):  #os.path.isdir (path) 判断 path 路径是否是一个目录
        z = zipfile.ZipFile(src_path,'r')
        z.extractall(path=target_path)
        z.close()
unzip_data('data/data00001/test_data.zip','data/data00001/test_data')
unzip_data('data/data00001/train_data.zip','data/data00001/train_data')

执行这一段代码后效果如下:

生效前图
生效后图

点开这两个文件夹,可以发现压缩文件的内容已经被解压到这两个文件夹里了

下面是通过指定目录,统计所有的不同文件类型及占用内存的代码

import os
size_dict = {}
type_dict = {}
def get_size_type(path):
    files = os.listdir(path) # 返回目录文件夹中所有文件名或文件夹的列表
    for filename in files:
        temp_path = os.path.join(path,filename) # 构建绝对路径
        if os.path.isdir(temp_path):  #如果这是一个文件夹,那么递归解析这个文件夹
            get_size_type(temp_path)
        elif os.path.isfile(temp_path): #如果这是一个文件
            type_name = os.path.splitext(temp_path)[1] #分离文件名和扩展名,返回的是有两个元素的列表,放着分建名和扩展名
            if not type_name: #如果这个文件没有扩展名
                type_dict.setdefault("None",0)
                type_dict["None"] += 1
                size_dict.setdefault("None",0)
                size_dict["None"] += os.path.getsize(temp_path)
            else:  #如果有扩展名
                type_dict.setdefault(type_name,0)
                type_dict[type_name] += 1
                size_dict.setdefault(type_name,0)
                size_dict[type_name] += os.path.getsize(temp_path)
path = "data/"
get_size_type(path)
for each_type in type_dict.keys():
    print ("%5s下共有【%5s】的文件【%5d】个,占用内存【%7.2f】MB" %     
            (path,each_type,type_dict[each_type],\
            size_dict[each_type]/(1024*1024)))
print("总文件数:【%d】"%(sum(type_dict.values())))    
print("总内存大小:【%.2f】GB"%(sum(size_dict.values())/(1024**3)))

输出结果如下:

输出结果