python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python判断文件和文件夹

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

作者: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判断文件和文件夹内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文