【模块化编程】Python文件路径检查、跳转模块

🌈 个人主页:十二月的猫-CSDN博客

🔥 系列专栏: 🏀《PyTorch科研加速指南:即插即用式模块开发》-CSDN博客

💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光

目录

[1. 前言](#1. 前言)

[2. 文件路径检查模块](#2. 文件路径检查模块)

[2.1 模块使用方法](#2.1 模块使用方法)

[2.2 子模块1:当前路径输出](#2.2 子模块1:当前路径输出)

[2.3 子模块2:路径跳转](#2.3 子模块2:路径跳转)

[2.4 子模块3:根目录完整路径展示](#2.4 子模块3:根目录完整路径展示)

[2.5 子模块4:目标路径检查](#2.5 子模块4:目标路径检查)

[3. 完整模块展示](#3. 完整模块展示)

[4. 总结](#4. 总结)


1. 前言

  • 👑**《PyTorch科研加速指南:即插即用式模块开发》**专栏持续更新中,未来最少文章数量为100篇。由于专栏刚刚建立,目前免费,后续将慢慢恢复原价至99.9🍉。
  • 👑**《PyTorch科研加速指南:即插即用式模块开发》**专栏主要针对零基础入门的小伙伴。不需要Python基础,不需要深度学习基础,只要你愿意学,这一个专栏将真正让你做到零基础入门。
  • 🔥每例项目都包括理论讲解、数据集、源代码

正在更新中💹💹

🚨项目运行环境:

  • 平台: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:当前路径输出

python 复制代码
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)。

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

2.3 子模块2:路径跳转

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

父路径跳转:

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

python 复制代码
from pathlib import Path

# 获取当前脚本所在目录的父目录,并输出绝对路径
script_parent = Path(__file__).resolve().parent
print(f"父目录完整路径: {script_parent}")
  • .parent: 获取父目录。返回路径的父目录。若路径是 /home/user/project/script.py:

    python 复制代码
    Path(__file__).resolve().parent # /home/user/project

子路径跳转:

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

python 复制代码
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:根目录完整路径展示

python 复制代码
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:目标路径检查

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

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

3. 完整模块展示

python 复制代码
"""
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中的内容,主要还是对文件路径完整模块的一些功能进行调整(都已经注释好了)

4. 总结

【如果想学习更多深度学习文章,可以订阅一下热门专栏】

如果想要学习更多pyTorch/python编程的知识,大家可以点个关注并订阅,持续学习、天天进步你的点赞就是我更新的动力,如果觉得对你有帮助,辛苦友友点个赞,收个藏呀~~~

相关推荐
難釋懷34 分钟前
bash的特性-bash中的引号
开发语言·chrome·bash
Hello eveybody1 小时前
C++按位与(&)、按位或(|)和按位异或(^)
开发语言·c++
6v6-博客2 小时前
2024年网站开发语言选择指南:PHP/Java/Node.js/Python如何选型?
java·开发语言·php
Baoing_2 小时前
Next.js项目生成sitemap.xml站点地图
xml·开发语言·javascript
被AI抢饭碗的人2 小时前
c++:c++中的输入输出(二)
开发语言·c++
lqqjuly2 小时前
C++ 面向对象关键语法详解:override、虚函数、转发调用和数组引用传参-策略模式
开发语言·c++
CPPAlien2 小时前
Python for MLOps - 第一阶段学习笔记
python
only-lucky2 小时前
QT日历控件重写美化
开发语言·qt
淬渊阁2 小时前
Hello world program of Go
开发语言·后端·golang