使用python统计文件夹以及子文件夹中的文件数目

部署运行你感兴趣的模型镜像

【时间】2018.11.25

【题目】使用python统计文件夹以及子文件夹中的文件数目

概述

使用python统计文件夹以及子文件夹中的文件数目,并将结果写入txt文件中。只统计有文件的文件夹,空文件夹直接跳过。

【代码】:

import os

from progressbar import ProgressBar

path ='F:\\test\\devel'

original_images =[]



#walk direction

for root, dirs, filenames in os.walk(path):

    for filename in filenames:

        original_images.append(os.path.join(root, filename))

original_images = sorted(original_images)



print('num:',len(original_images))

f = open('tongji_files.txt','w+')

error_images =[]

progress = ProgressBar()

current_dirname =os.path.dirname(original_images[0])

file_num =0

for filename in progress(original_images):

    dirname = os.path.dirname(filename)

    if dirname != current_dirname or filename == original_images[-1]:

        if filename == original_images[-1]:

            file_num += 1

        f.write('%s:\t%d\n'%(current_dirname,file_num))

        current_dirname = dirname

        file_num = 1

    else:

        file_num +=1

f.seek(0)

for s in f:

    print(s)

f.close()

 

【运行结果】:

txt文件:

 

 

 

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我需要帮助用户用Python编写一个程序来统计指定文件夹的大小以及其中的文件文件夹量。首先,我需要回忆一下Python中处理文件目录的相关模块,比如osos.path。 用户提到了需要统计总大小、文件子目录。我应该考虑如何遍历目录树,这里os.walk函可能非常有用,因为它可以递归地访问所有子目录。对于每个目录,os.walk会返回当前目录路径、子目录列表文件列表。 接下来,我需要分别统计文件子目录量。每次进入一个目录时,文件列表的长度就是该目录下的文件量,可以累加到总文件中。而子目录量可能需要另外处理,因为os.walk返回的子目录列表中的每个条目都是当前目录下的子目录,所以每次遍历时子目录量应该是子目录列表的长度,然后累加到总子目录中。不过需要注意的是,遍历时会进入每个子目录,所以可能需要调整统计方式,避免重复计算。或者,总子目录实际上是遍历过程中遇到的所有目录的量减去根目录的量。比如,初始目录算一个,之后每个子目录都算一个。这时候可能需要单独统计目录的量。 然后是计算总大小。每个文件的大小可以通过os.path.getsize获取,然后将所有文件的大小累加起来就是总大小。 接下来,我需要考虑如何将这些逻辑整合到一个函中。可能需要定义一个函,接收目录路径作为参,然后初始化总大小、文件目录的计器。使用os.walk遍历目录,对于每个目录,将文件加上当前目录下的文件量,目录则可能需要初始化为0,然后每次遍历时,目录增加1(因为每个遍历的目录都是一个存在的目录),再加上当前目录下的子目录量?或者可能需要在遍历时,目录累加每个目录下的子目录量,但这可能会重复计算。比如,根目录下有两个子目录AB,那么根目录遍历时子目录列表是[A,B],这时候总子目录应该加2,然后当进入A目录时,如果A目录下有C目录,这时候子目录加1。所以总子目录实际上是所有子目录量,包括所有层级的。这时候可能需要单独统计,即每次遍历到一个目录时,总目录加1,而初始目录也要算进去。例如,对于根目录,总目录是1,子目录AB,进入A后总目录加1,变成2,进入B后加1变成3,如果有更多子目录,以此类推。这时候总目录实际上是遍历过的所有目录的量,而每个os.walk的循环中的root就是一个目录,所以每次循环处理root时,总目录加1。这样统计的话,目录就是总共有多少个目录,包括根目录所有子目录。而用户可能需要的是子目录量,即总目录减去1(假设根目录不算子目录)。需要明确用户的需求,用户问题中的文件夹量”指的是根目录下的直接文件夹,还是所有层级的文件夹。根据问题描述,“统计指定目录的总大小、文件子目录的方法”,这里的子目录应该包括所有层级的子目录,所以应该统计遍历过程中所有目录的量,包括根目录。但通常可能用户希望的是子目录量,即不包括根目录本身。所以可能需要根据具体情况调整。 或者,可能用户希望的是统计所有子目录量,包括所有层级的,比如根目录下的子目录子目录子目录等,这时候总目录应该是遍历到的所有目录的量减去根目录的量。例如,遍历根目录时,目录加1,然后每个子目录遍历时,目录也加1,总目录为所有目录的量,而子目录就是总目录减1。这样可能更符合用户的预期。 现在,我需要明确这三个统计量: 总大小:所有文件大小的总文件:所有文件的个,每个文件只计算一次,无论层级。 子目录:根目录下的所有子目录(包括嵌套的子目录)的量。或者,是否包括根目录?比如,如果用户指定目录是/path/to/dir,那么子目录是否包括/path/to/dir本身?可能用户希望的是统计该目录下的所有子目录量,即不包含自己。例如,如果指定目录下有子目录A,A下有子目录B,那么子目录是2(AB)。或者可能用户希望子目录仅指直接子目录量。这里需要明确。 根据用户的问题描述:“统计指定目录的总大小、文件子目录的方法”。这里的子目录可能指的是所有层级的子目录量,包括嵌套的子目录。例如,如果一个目录下有一个子目录,而该子目录下还有另一个子目录,那么总子目录是2。此时,正确的方法是在遍历过程中统计每个遇到的目录的量,然后减去根目录的量。例如,每次调用os.walk时,root是一个目录,初始目录会被统计,所以总目录是所有遍历的root的量,而子目录是总目录减1。 因此,在代码中,可以初始化dir_count为0,每次进入一个目录(即每次循环中的root),dir_count +=1。最后,子目录就是dir_count -1,因为根目录不算子目录。例如,如果用户指定的目录是根目录,那么dir_count为1,子目录为0。如果根目录下有一个子目录,那么dir_count是2(根目录子目录),子目录是1。 这样处理的话,子目录就是总目录减1。这可能更符合用户的需求。 接下来,如何实现: 1. 遍历目录:使用os.walk。 2. 初始化total_size=0,file_count=0,dir_count=0。 3. 对于每次循环中的root, dirs, files: a. dir_count +=1(因为root是一个目录) b. file_count += len(files) c. 对于每个文件,获取其路径,然后os.path.getsize,累加到total_size。 但是,这里需要注意,文件的大小可能不是其占用的磁盘空间,而是实际大小。比如,对于符号链接或者稀疏文件,可能需要特殊处理。但根据一般需求,直接使用os.path.getsize应该可以。 然后,当遍历完成后,子目录就是dir_count -1。 例如: 目录结构: test_dir/ file1.txt (100 bytes) subdir1/ file2.txt (200 bytes) subdir2/ file3.txt (300 bytes) 当遍历test_dir时,os.walk会遍历三个目录: test_dir/ test_dir/subdir1/ test_dir/subdir1/subdir2/ 所以dir_count=3,子目录为3-1=2。 文件为3。 总大小是100+200+300=600。 这样处理应该正确。 现在,编写代码的大致步骤: 导入os模块。 定义函,比如get_dir_info(path): 初始化total_size=0,file_count=0,dir_count=0. 然后,遍历os.walk(path): for root, dirs, files in os.walk(path): dir_count +=1 file_count += len(files) for file in files: file_path = os.path.join(root, file) total_size += os.path.getsize(file_path) 最后,子目录是dir_count -1. 返回total_size, file_count, dir_count-1. 但是,需要注意权限问题,比如某些文件或目录无法访问,这时候os.walk可能会抛出异常。所以可能需要处理异常,或者忽略不可访问的目录。但用户的问题可能暂时不需要处理这种情况,先不考虑。 接下来,测试这个函是否正确。 例如,在test_dir的例中: dir_count=3,所以子目录是2。符合预期。 这样应该正确。 现在,用户可能需要格式化输出,比如将总大小转换为可读的格式,如KB、MB等。但用户的问题可能只需要返回原始字节,或者根据需求处理。不过用户的问题中,示例引用的参考引用中有显示大小的例,可能需要类似的处理,比如转换为KB、MB等。 例如,参考引用3中的代码展示了如何遍历文件夹获取文件大小,并累计总。所以可能需要将总大小转换为人类可读的格式。 因此,在最终输出时,可以添加一个函将字节转换为更友好的格式,比如: def convert_size(size_bytes): # 根据大小转换为KB, MB, GB等 for unit in ['B', 'KB', 'MB', 'GB']: if size_bytes < 1024.0: return f"{size_bytes:.2f} {unit}" size_bytes /= 1024.0 return f"{size_bytes:.2f} TB" 然后,在最终输出时调用这个函。 所以,完整的代码可能包括: import os def convert_size(size_bytes): for unit in ['B', 'KB', 'MB', 'GB']: if size_bytes < 1024.0: return f"{size_bytes:.2f} {unit}" size_bytes /= 1024.0 return f"{size_bytes:.2f} TB" def get_dir_info(path): total_size = 0 file_count = 0 dir_count = 0 for root, dirs, files in os.walk(path): dir_count += 1 file_count += len(files) for file in files: file_path = os.path.join(root, file) try: total_size += os.path.getsize(file_path) except OSError: # 忽略无法访问的文件 pass subdir_count = dir_count - 1 # 减去根目录 return total_size, file_count, subdir_count if __name__ == "__main__": import sys if len(sys.argv) != 2: print("Usage: python dir_info.py <directory>") sys.exit(1) target_dir = sys.argv[1] if not os.path.isdir(target_dir): print(f"Error: {target_dir} is not a valid directory.") sys.exit(1) size, files, subdirs = get_dir_info(target_dir) print(f"总大小: {convert_size(size)}") print(f"文件: {files}") print(f"子目录: {subdirs}") 不过,这里有几个需要注意的地方: 1. os.walk的遍历顺序是深度优先还是广度优先?实际上,os.walk默认是自顶向下的遍历,可以处理每个目录的子目录。 2. 处理文件大小时,如果遇到符号链接,os.path.getsize会返回链接本身的大小,而不是目标文件的大小。如果需要统计链接指向的文件的大小,可能需要使用os.path.realpath来解析符号链接。但根据一般需求,可能只需统计链接本身的大小,或者忽略符号链接。用户的问题可能不需要处理这种情况,但需要在代码中进行处理。例如,在遍历时,可以检查是否为符号链接,如果是则跳过。或者根据用户需求决定。 例如,在统计时,可以检查文件是否为符号链接,如果是,可以选择是否统计: for file in files: file_path = os.path.join(root, file) if os.path.islink(file_path): continue # 跳过符号链接 try: total_size += os.path.getsize(file_path) except OSError: pass 但用户的问题中没有提到符号链接的处理,所以可能不需要这一步,但需要考虑是否需要处理这种情况。 另外,目录本身在文件系统中可能占用一定的磁盘空间,但通常统计目录大小时只计算其中文件的大小总,而不包括目录元据的大小。所以当前的代码是正确的,因为只统计文件的大小。 现在,测试代码是否正确。 例如,在某个目录下运行,输出是否符合预期。 另一个需要注意的问题是,os.walk可能会因为权限问题无法访问某些子目录,导致遍历中断。此时,代码中的try-except块只处理文件的访问错误,而没有处理目录的访问错误。例如,当某个子目录无法访问时,os.walk会抛出异常,导致循环终止。为了避免这种情况,可以在os.walk的循环中添加异常处理,或者使用更稳健的方法。 例如,修改os.walk的调用方式,处理错误: for root, dirs, files in os.walk(path): try: # 处理当前目录 except PermissionError: # 无法访问,跳过该目录 dirs[:] = [] # 阻止进入该目录的子目录 continue 但具体的处理方式可能更复杂。根据参考引用中的示例,比如引用3中的代码,他们可能没有处理这些异常,所以为了简单起见,这里暂时不处理,但需要在代码中提醒用户可能需要处理权限问题。 此外,代码中的dir_count在每次循环中加1,而os.walk会遍历所有可访问的目录,所以即使某些目录无法访问,dir_count可能不准确。但假设所有目录都可访问的情况下,代码是正确的。 现在,结合用户提供的参考引用,参考1提到了使用os.listdiros.walk来统计文件数目,参考23提到了使用os.walk来遍历目录。因此,当前的代码符合这些方法。 现在,用户的问题是如何用Python编写这个程序,所以给出完整的代码示例,并解释步骤。 另外,用户的问题中的引用可能可以作为参考,比如引用1、2、3中的方法。例如,引用3指出使用os.walk来遍历文件夹获取文件大小,这与当前的解决方案一致。 因此,在回答中需要引用这些参考资料。例如,在解释os.walk的使用时,可以引用参考3中的方法。 综上,编写代码的思路是: 1. 使用os.walk遍历所有目录文件。 2. 统计总大小、文件目录。 3. 转换总大小为可读格式。 4. 处理可能的异常(如权限问题,但示例中可能省略)。 最后,生成相关问题,如如何优化性能,处理符号链接,或者如何处理大目录等。</think>以下是使用Python统计指定目录总大小、文件子目录的实现方法: ### 实现步骤 1. **目录遍历**:使用`os.walk()`递归遍历目录及其子目录[^3] 2. **统计文件**:累加每个目录下的文件量 3. **统计目录**:通过遍历次计算总目录,减去根目录得到子目录 4. **计算总大小**:累加每个文件的字节大小 5. **格式转换**:将字节转换为易读的存储单位 ```python import os def convert_size(size_bytes): """ 将字节转换为可读格式 """ for unit in ['B', 'KB', 'MB', 'GB']: if size_bytes < 1024.0: return f"{size_bytes:.2f} {unit}" size_bytes /= 1024.0 return f"{size_bytes:.2f} TB" def get_directory_info(path): """ 统计目录信息 """ total_size = 0 file_count = 0 dir_count = 0 for root, dirs, files in os.walk(path): dir_count += 1 # 统计包括根目录在内的所有目录 file_count += len(files) for file in files: file_path = os.path.join(root, file) try: total_size += os.path.getsize(file_path) except OSError: pass # 跳过无法访问的文件 return total_size, file_count, dir_count - 1 # 扣除根目录 if __name__ == "__main__": import sys if len(sys.argv) != 2: print("使用方法: python dir_stats.py <目录路径>") sys.exit(1) target_dir = sys.argv[1] if not os.path.isdir(target_dir): print(f"错误: {target_dir} 不是有效目录") sys.exit(1) size, files, subdirs = get_directory_info(target_dir) print(f"统计结果:{target_dir}") print("-" * 30) print(f"总大小: {convert_size(size)}") print(f"文件量: {files}") print(f"子目录量: {subdirs}") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值