当前位置: 首页 > 网络编程 > python

Python进行文件路径处理的模块详解<

时间:2025-07-01 21:05:52 python 我要投稿
我相信很多人和小编一样,从来没有好好研究过Python的文件路径,Python作为一个magical语言,肯定有其他更直观的文件路径处理方法,下面就跟随小编一起了解一下吧

1. 前言

项目运行环境:

  • 平台:Window11
  • 语言环境:Python3.8
  • 运行环境1:PyCharm 2021.3
  • 运行环境2:Jupyter Notebook 7.3.2
  • 框架:PyTorch 2.5.1(CUDA11.8)

2. 文件路径检查模块

我相信很多人和猫猫一样,从来没有好好研究过Python的文件路径。之前对于文件路径输出、跳转、完整路径的知识完全来自于Java和linux。例如./、../ 这样子,你说可以用嘛,自然是可以的。但是这样子实在是太不直观了,Python作为一个magical语言,肯定有其他更直观的文件路径处理方法。你别说,还真有,今天猫猫就来带你们看看。

2.1 模块使用方法

假如你现在想要从一个文件中拿出一个东西 或者 把你生成的东西放到一个文件中,此时你就必须使用这样一个文件路径模块了。作用是用来看你需要的东西,它到底在路径层面怎么放到那一个文件夹中,或从文件夹中拿出来。

不要说你要看PyCharm旁边的目录结构就可以了,猫猫今天被坑了1个多小时。因为跑深度学习的代码我们都是放在服务器中跑的,但是写代码都是在本机PyCharm中写的,因此两者的目录结构大概率是不一样的,一旦不注意就容易和猫猫一样被坑好几个小时,所以每次处理和文件路径有关的东西,都建议先用猫猫的模块做一个检查。

2.2 子模块1:当前路径输出

from pathlib import Path
 
# 获取当前脚本所在目录,并输出绝对路径
script_parent = Path(__file__).resolve()
print(f"当前脚本目录完整路径: {script_parent}")

Path(__file__):创建路径对象。将当前脚本的文件路径转换为 pathlib.Path 对象。

.resolve():解析为绝对路径。相对路径转换为绝对路径(如 ./script.py → /home/user/project/script.py)。

Path(__file__)          # /usr/bin/myscript(符号链接路径)
Path(__file__).resolve() # /home/user/project/script.py(实际路径)

2.3 子模块2:路径跳转

通过前面的模块,我们就看可以看到自己代码所在的目录。现在我们想要实现路径的跳转,因为我们看路径的本质就是为了到一个我们想要的路径中拿到我们想要的东西,或者将我们的东西送到我们想要的地方去,这都涉及路径的跳转。路径跳转分为:父路径跳转+子路径跳转。

父路径跳转:

本质就是退出当前路径,回到父目录。

from pathlib import Path
 
# 获取当前脚本所在目录的父目录,并输出绝对路径
script_parent = Path(__file__).resolve().parent
print(f"父目录完整路径: {script_parent}")

 .parent:获取父目录。返回路径的父目录。若路径是 /home/user/project/script.py:

Path(__file__).resolve().parent # /home/user/project

子路径跳转:

本质就是在当前目录中往下深入,因此就是在目录路径后面追加一部分路径内容。

script_dir = Path(__file__).resolve().parent.parent.parent
target_dir = script_dir / "Real-ESRGAN-main" / "inputs"
target_dir1 = script_dir / "Real-ESRGAN-main"

/:后面跟上想要进入的路径名称即可,可以一级一级叠加使用

.parent:同样允许一级一级叠加使用 

2.4 子模块3:根目录完整路径展示

def generate_file_tree(directory: str, max_depth: int = 3) -> str:
    """生成带格式的目录树(优化递归性能)"""
 
    def _tree(path: Path, prefix: str = "", depth=0) -> str:
        if depth > max_depth:
            return ""
 
        try:
            items = sorted(path.iterdir(), key=lambda x: (not x.is_dir(), x.name.lower()))
        except PermissionError:
            return f"{prefix}└──  权限不足"
        except FileNotFoundError:
            return f"{prefix}└── ❓ 目录已消失"
 
        contents = []
        for index, item in enumerate(items):
            is_last = index == len(items) - 1
            connector = "└── " if is_last else "├── "
 
            # 文件类型识别
            if item.is_symlink():
                icon = ""
                suffix = f" -> {item.resolve()}"
            elif item.is_dir():
                icon = ""
                suffix = ""
            else:
                icon = ""
                suffix = f" ({item.stat().st_size // 1024} KB)" if item.stat().st_size > 0 else " (空文件)"
 
            entry = f"{prefix}{connector}{icon} {item.name}{suffix}"
            contents.append(entry)
 
            # 递归处理子目录
            if item.is_dir() and not item.is_symlink():
                extension = "    " if is_last else "│   "
                contents.append(_tree(item, prefix + extension, depth + 1))
 
        return "\n".join(contents) if contents else f"{prefix}└──  空目录"
 
    root = Path(directory)
    if not root.exists():
        return f"❌ 路径不存在: {directory}"
 
    return f" 目录树 {root} (深度限制: {max_depth})\n" + _tree(root)

通过上面代码,我们能够去找指定路径下面的所有完整路径目录。通过前面三个模块,我们可以回到我们代码所在的根目录,然后通过这个代码,我们就可以找到根目录下面所有的目录结构。

2.5 子模块4:目标路径检查

根据前面三个子模块,我们已经可以找到目标路径。现在就是验证目标路径是否存在即可,因此需要对目标路径进行检查。

def path_exists(path_str: str) -> bool:
    """通用路径存在性检查"""
    return Path(path_str).exists()

3. 完整模块展示

"""
path_analyzer.py - 多功能路径分析工具
功能包含:
1. 脚本自身路径信息展示
2. 智能目录树生成
3. 路径存在性验证
4. 递归深度控制
"""
 
from pathlib import Path
import argparse
 
# 获取脚本路径信息
script_path = Path(__file__).resolve()
script_dir = script_path.parent
 
 
def show_script_info():
    """显示脚本自身路径信息"""
    print(f" 脚本路径: {script_path}")
    print(f" 脚本目录: {script_dir}\n")
 
 
def generate_file_tree(directory: str, max_depth: int = 3) -> str:
    """生成带格式的目录树(优化递归性能)"""
 
    def _tree(path: Path, prefix: str = "", depth=0) -> str:
        if depth > max_depth:
            return ""
 
        try:
            items = sorted(path.iterdir(), key=lambda x: (not x.is_dir(), x.name.lower()))
        except PermissionError:
            return f"{prefix}└──  权限不足"
        except FileNotFoundError:
            return f"{prefix}└── ❓ 目录已消失"
 
        contents = []
        for index, item in enumerate(items):
            is_last = index == len(items) - 1
            connector = "└── " if is_last else "├── "
 
            # 文件类型识别
            if item.is_symlink():
                icon = ""
                suffix = f" -> {item.resolve()}"
            elif item.is_dir():
                icon = ""
                suffix = ""
            else:
                icon = ""
                suffix = f" ({item.stat().st_size // 1024} KB)" if item.stat().st_size > 0 else " (空文件)"
 
            entry = f"{prefix}{connector}{icon} {item.name}{suffix}"
            contents.append(entry)
 
            # 递归处理子目录
            if item.is_dir() and not item.is_symlink():
                extension = "    " if is_last else "│   "
                contents.append(_tree(item, prefix + extension, depth + 1))
 
        return "\n".join(contents) if contents else f"{prefix}└──  空目录"
 
    root = Path(directory)
    if not root.exists():
        return f"❌ 路径不存在: {directory}"
 
    return f" 目录树 {root} (深度限制: {max_depth})\n" + _tree(root)
 
 
def path_check(path_str: str) -> dict:
    """增强型路径检查"""
    path = Path(path_str)
    status = {
        'exists': path.exists(),
        'is_file': path.is_file(),
        'is_dir': path.is_dir(),
        'size': path.stat().st_size if path.exists() else 0
    }
    return status
 
 
def main():
    """命令行入口点"""
    parser = argparse.ArgumentParser(description="路径分析工具")
    parser.add_argument('path', nargs='?', default=str(script_dir), help="要分析的路径(默认为脚本目录)")
    parser.add_argument('-d', '--max-depth', type=int, default=3, help="目录树递归深度(默认3)")
    parser.add_argument('-q', '--quiet', action='store_true', help="静默模式(不显示脚本信息)")
 
    args = parser.parse_args()
 
    if not args.quiet:
        show_script_info()
 
    # 路径有效性检查
    check_result = path_check(args.path)
    if not check_result['exists']:
        print(f"❌ 错误:路径不存在 - {args.path}")
        return
 
    # 生成目录树
    tree = generate_file_tree(args.path, args.max_depth)
    print(tree)
 
    # 显示统计信息
    print(f"\n 路径统计:")
    print(f"  - 类型: {'目录' if check_result['is_dir'] else '文件'}")
    if check_result['is_dir']:
        print(f"  - 包含项目: {len(list(Path(args.path).iterdir()))}")
    else:
        print(f"  - 文件大小: {check_result['size'] // 1024} KB")
 
 
if __name__ == "__main__":
    main()

注意哈,上面的模块代码可以直接使用,仅仅需要修改的只有def main中的内容,主要还是对文件路径完整模块的一些功能进行调整(都已经注释好了)

到此这篇关于Python进行文件路径检查的模块详解的文章就介绍到这了,更多相关Python文件路径检查内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!