Python判断一个目录下哪些是文件哪些是文件夹的方法

 更新时间:2025年09月17日 08:41:45   作者:detayun  
本文介绍Python中识别目录文件及文件夹的完整方案,支持跨平台路径处理、文件属性分析(类型/大小/时间)、递归扫描、统计汇总,并提供彩色树形输出与错误处理功能,满足多样化需求,需要的朋友可以参考下

在Python中识别目录下的文件和文件夹非常简单,以下是完整解决方案:

import os
import sys
import argparse
from datetime import datetime

def list_directory_contents(directory_path, recursive=False, output_file=None):
    """
    高级目录扫描工具
    - 支持递归扫描子目录
    - 显示详细文件属性
    - 可选输出到文件
    - 自动处理路径异常
    
    :param directory_path: 要扫描的目录路径
    :param recursive: 是否递归扫描子目录
    :param output_file: 输出结果的文件路径
    """
    # 验证并清理路径
    directory_path = os.path.abspath(directory_path)
    
    # 自动创建不存在的目录
    if not os.path.exists(directory_path):
        try:
            os.makedirs(directory_path)
            print(f"✅ 已创建目录: {directory_path}")
        except OSError as e:
            print(f"❌ 无法创建目录: {e}")
            return
    
    # 确保是目录
    if not os.path.isdir(directory_path):
        print(f"❌ 错误: '{directory_path}' 不是一个目录")
        return
    
    results = []
    
    def scan_directory(path, level=0):
        """递归扫描目录"""
        try:
            with os.scandir(path) as entries:
                for entry in entries:
                    try:
                        # 获取文件信息
                        stat = entry.stat()
                        size = stat.st_size
                        modified_time = stat.st_mtime
                        created_time = stat.st_ctime
                        
                        # 格式化时间
                        modified_str = datetime.fromtimestamp(modified_time).strftime('%Y-%m-%d %H:%M:%S')
                        created_str = datetime.fromtimestamp(created_time).strftime('%Y-%m-%d %H:%M:%S')
                        
                        # 判断文件类型
                        if entry.is_file():
                            entry_type = '文件'
                        elif entry.is_dir():
                            entry_type = '文件夹'
                        elif entry.is_symlink():
                            entry_type = '符号链接'
                        else:
                            entry_type = '其他类型'
                            
                        # 收集信息
                        info = {
                            'name': entry.name,
                            'type': entry_type,
                            'size': size,
                            'modified': modified_str,
                            'created': created_str,
                            'path': os.path.abspath(entry.path),
                            'level': level
                        }
                        
                        results.append(info)
                        
                        # 递归扫描子目录
                        if recursive and entry.is_dir():
                            scan_directory(entry.path, level + 1)
                    except OSError as e:
                        print(f"⚠️ 无法访问 '{entry.path}': {e}", file=sys.stderr)
        except PermissionError:
            print(f"⚠️ 权限不足,无法扫描 '{path}'", file=sys.stderr)
        except OSError as e:
            print(f"⚠️ 扫描 '{path}' 时发生错误: {e}", file=sys.stderr)
    
    # 开始扫描
    print(f"🔍 扫描目录: {directory_path}")
    scan_directory(directory_path)
    
    # 输出结果
    if results:
        # 打印结果
        print("\n📂 目录结构:")
        for info in results:
            # 创建缩进
            indent = ' ' * (info['level'] * 4)
            # 文件大小格式化
            size_str = format_size(info['size'])
            # 打印信息
            print(f"{indent}[{info['type']}] {info['name']} - {size_str} - 修改时间: {info['modified']}")
        
        # 统计信息
        file_count = sum(1 for r in results if r['type'] == '文件')
        dir_count = sum(1 for r in results if r['type'] == '文件夹')
        symlink_count = sum(1 for r in results if r['type'] == '符号链接')
        
        print(f"\n📊 统计信息:")
        print(f"  文件数量: {file_count}")
        print(f"  文件夹数量: {dir_count}")
        print(f"  符号链接数量: {symlink_count}")
        print(f"  总条目数: {len(results)}")
        
        # 保存到文件
        if output_file:
            try:
                with open(output_file, 'w', encoding='utf-8') as f:
                    f.write("📑 目录结构报告\n")
                    f.write("="*50 + "\n\n")
                    f.write(f"扫描路径: {directory_path}\n")
                    f.write(f"扫描时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
                    f.write(f"总条目数: {len(results)}\n\n")
                    
                    # 写入详细信息
                    for info in results:
                        indent = ' ' * (info['level'] * 4)
                        size_str = format_size(info['size'])
                        f.write(f"{indent}[{info['type']}] {info['name']} - {size_str} - 修改时间: {info['modified']}\n")
                    
                    # 写入统计信息
                    f.write("\n📊 统计信息:\n")
                    f.write(f"文件数量: {file_count}\n")
                    f.write(f"文件夹数量: {dir_count}\n")
                    f.write(f"符号链接数量: {symlink_count}\n")
                print(f"✅ 结果已保存到: {output_file}")
            except OSError as e:
                print(f"❌ 无法保存结果到文件: {e}")
    else:
        print("📁 目录为空")

def format_size(size_bytes):
    """
    将字节大小转换为更易读的格式
    :param size_bytes: 文件大小(字节)
    :return: 格式化后的字符串
    """
    if size_bytes == 0:
        return "0 B"
    
    units = ["B", "KB", "MB", "GB", "TB"]
    num = abs(size_bytes)
    unit = units[0]
    
    for u in units[1:]:
        if num < 1024.0:
            break
        num /= 1024.0
        unit = u
    
    return f"{num:.2f} {unit}"

def main():
    """主函数,处理命令行参数"""
    # 创建命令行参数解析器
    parser = argparse.ArgumentParser(description='🔍 高级目录扫描工具')
    parser.add_argument('directory', nargs='?', default=os.getcwd(),
                        help='要扫描的目录路径(默认当前目录)')
    parser.add_argument('-r', '--recursive', action='store_true',
                        help='递归扫描子目录')
    parser.add_argument('-o', '--output',
                        help='输出结果到指定文件')
    
    # 解析参数
    args = parser.parse_args()
    
    # 运行目录扫描
    list_directory_contents(args.directory, args.recursive, args.output)

if __name__ == "__main__":
    main()

功能特点

智能路径处理

  • 自动创建不存在的目录
  • 规范路径格式
  • 处理跨平台路径问题

详细文件属性

  • 文件类型识别(文件/文件夹/符号链接)
  • 文件大小(自动转换单位)
  • 创建和修改时间
  • 完整路径信息

高级功能

  • 递归扫描子目录
  • 统计信息汇总
  • 结果输出到文件
  • 错误处理和权限检查

用户友好输出

  • 彩色符号标识
  • 树形结构展示
  • 格式化文件大小
  • 清晰的统计信息

使用方法

# 扫描当前目录
python scanner.py

# 扫描指定目录
python scanner.py /path/to/directory

# 递归扫描子目录
python scanner.py /path/to/directory -r

# 递归扫描并保存结果到文件
python scanner.py /path/to/directory -r -o report.txt

输出示例

🔍 扫描目录: /run_python/example_dir

📂 目录结构:
[文件夹] images
[文件夹] documents
[文件] report.docx - 128.43 KB - 修改时间: 2023-10-05 14:30:00
[文件夹] archive
[文件] presentation.pptx - 2.10 MB - 修改时间: 2023-10-04 10:15:00

📊 统计信息:
  文件数量: 2
  文件夹数量: 3
  符号链接数量: 0
  总条目数: 5

这个工具提供了专业的目录扫描解决方案,能够满足各种文件和文件夹识别需求,同时具备强大的错误处理和用户友好的输出界面。

到此这篇关于Python判断一个目录下哪些是文件哪些是文件夹的方法的文章就介绍到这了,更多相关Python判断文件和文件夹内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Python编程中time模块的使用

    详解Python编程中time模块的使用

    这篇文章主要介绍了详解Python编程中time模块的使用,是Python入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • keras:model.compile损失函数的用法

    keras:model.compile损失函数的用法

    这篇文章主要介绍了keras:model.compile损失函数的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Ubuntu20.04环境安装tensorflow2的方法步骤

    Ubuntu20.04环境安装tensorflow2的方法步骤

    这篇文章主要介绍了Ubuntu20.04环境安装tensorflow2的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 基于Python开发chrome插件的方法分析

    基于Python开发chrome插件的方法分析

    这篇文章主要介绍了基于Python开发chrome插件的方法,结合实例形式分析了Python实现chrome浏览器插件相关操作技巧,需要的朋友可以参考下
    2018-07-07
  • 使用Python和wxPython实现下载视频封面

    使用Python和wxPython实现下载视频封面

    这篇文章主要为大家详细介绍了如何使用Python和wxPython实现下载视频封面,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • Django import export实现数据库导入导出方式

    Django import export实现数据库导入导出方式

    这篇文章主要介绍了Django import export实现数据库导入导出方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • django中的数据库迁移的实现

    django中的数据库迁移的实现

    这篇文章主要介绍了django中的数据库迁移的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • python Tkinter版学生管理系统

    python Tkinter版学生管理系统

    这篇文章主要为大家详细介绍了python Tkinter版学生管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • 关于Python中函数的几种形参

    关于Python中函数的几种形参

    这篇文章主要介绍了关于Python中函数的几种形参,python中函数是非常重要的一个知识点,想要把函数学习好,就必须要把函数的参数学习好,这样才能够进行很好的传递参数,发挥出应有的作用,需要的朋友可以参考下
    2023-08-08
  • K-means聚类算法介绍与利用python实现的代码示例

    K-means聚类算法介绍与利用python实现的代码示例

    K-means聚类算法(事先数据并没有类别之分!所有的数据都是一样的)是我们大家应该都听过的一种算法,下面这篇文章主要给大家介绍了关于K-means聚类算法的基础知识与利用python如何实现该算法的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-11-11

最新评论