python 路径操作工具 pathlib,比 os 模块好用太多

本文详细介绍Python的Pathlib模块,对比os.path,Pathlib在路径处理上更具优势,如清晰的导入,面向对象的设计,简化路径操作,获取路径信息等。文章覆盖路径获取,文件元信息读取,路径操作等方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 python 当中,如果你想控制路径,基本上绕不开 os.path。我希望看完这篇文章以后,熟练使用 python 的你能立刻开始使用 pathlib 模块,一刻也不要耽误。

pathlib 相对于 os.path 有以下优势:

  • pathlib 导入更加清晰;
  • 采用面向对象编程,能同时存储更多状态,os.path 返回的通常只有一个字符串;
  • pathlib 使用更简单

获取路径相关信息

pathlib 会把路径相关信息都存在一个 Path 的核心类里面,比如用户名,后缀名,上层目录,文件创建时间,文件大小等等。 这些 os.path 是没有办法一次性都给我们的,因为 os.path 调用的函数几乎都是返回字符串格式,不能像 Path 对象这样保存状态。

1, 获取当前文件路径。这种操作方式可能会包含相对路径信息。

# 获取当前路径
current_path = Path(__file__)
print(current_path)

2,当前文件夹路径。

current_path = Path('.')
print(current_path)

3, 获取当前文件和文件夹的元信息。

st = current_path.stat()
print(st)
# 文件大小
print(st.st_size)
# 文件时间
print(st.st_atime)

4,Path(‘.’) 这种方式可以包含相对路径 ../doc 等,如果要获取绝对路径要使用 resolve 获取绝对路径。

current_path.resolve()

如果路径不存在, 是不会抛出异常的。如果想抛出异常,可以设置参数 strict 设为 True,抛出 FileNotFoundError。

current_path.resolve(strict=True)

5, 获取父目录。这是 os.path 最被人诟病的一点,你需要不停的通过 os.path.dirname() 去获取父目录,层级多了,心都碎了。 在 pathlib 里,因为采用的是对象形式,可以直接通过 parent 属性获取父目录,父目录同时也是一个 Path 对象,照样可以用 parent 去获取目录。

parent = current_path.parent.parent.parent

6, 如果需要不停的返回上一级目录,不停的 parent 属性也会让人不厌其烦。pathlib 提供了一种更灵活的机制让你去获取高层父目录, 就是 parents 属性。 parents 会把从根目录开始的所有层级都保存起来,直接通过索引获取对应层级就可以了。

parents = current_path.parent

first_p = parents[0]

second_p = parents[1]

这里有一点非常遗憾,pathlib 没有支持逆向索引,也就是说不能通过 parents[-2] 去达到和 current_path.parent.parent 相同的效果。在实际应用中,这种场景用得还是挺多的,需要通过某个文件获取上层路径,上上层路径。

# TODO: 可以封装的技能,目前未实现
parents[-3]

提供一种封装思路:

def my_parents(self, nagtive_num):
    ....
    return self.parents[len(current_path.parents) + nagtive_num]

还有一种思路,重写源码中的 __getitem__ 方法,这里不做深入阐述。

7, 获取文件名称

name = current_path.name

8, 获取文件后缀名。

file_suffix = current_path.suffix

9,获取不含后缀名的文件名。

file_without_suffix = current_path.stem

路径操作

1,with_name, 改变文件名, 生成新路径,实际文件不发生变化.

# 改变文件名为 new_name.py,生成新路径,实际文件不发生变化
# 原来的文件名封装在 current_path 对象中
with_name = current_path.with_name('new_name.py')

2, with_suffix, 改变后缀名。

# 改变后缀名,生成新路径,实际文件不发生变化
with_suffix = current_path.with_suffix('.new_suffix')

3, 路径拼接。 pathlib 提供了和 os.path.join() 类似的路径拼接方式:

new_path = current_path.joinpath('join_path')

更重要的是,他提供了一种更直观的方式 /

new_path = current_path / 'lemon/yuze' / 'yuze_again'

这种方式的实现原理学过测试开发课程的同学应该很容易想到,定义一个除法运算的魔术方法就可以。

思考:pathlib 可以完全代替 os.path 吗?

转载于:https://www.cnblogs.com/wagyuze/p/11578139.html

<think>嗯,用户让我介绍一下Pythonos模块,我需要用中文回答。首先,我应该回忆一下os模块的主要功能,然后组织成一个清晰的结构。可能用户是刚开始学习Python,所以需要解释得详细一些,但也不能太复杂。 首先,os模块是和操作系统交互的,对吧?比如文件操作、目录管理、环境变量这些。我应该分点说明,比如文件与目录操作、执行系统命令、环境变量管理、路径操作,还有跨平台注意事项。对了,os.path模块处理路径也很重要,可能需要单独提出来。 然后,每个部分需要举一些例子,这样用户更容易理解。比如,创建目录用os.mkdir,删除文件用os.remove。执行系统命令可以用os.system,但也要提到subprocess可能更强大。环境变量的话,os.environ是个字典,可以获取和设置。 路径操作方面,os.path.join、exists、isdir这些方法很常用,要举例说明。同时要提醒用户不同操作系统的路径分隔符不同,os模块会自动处理,所以用os.path比较好,避免硬编码。 可能用户还会关心跨平台的问题,比如Windows和Linux的区别,这时候要提到os模块处理这些差异的方式,比如使用os.sep或者os.path.join来保持可移植性。 另外,有没有常见的错误需要注意?比如删除目录时,os.rmdir只能删除空目录,如果要删除非空目录,需要用shutil.rmtree。这时候应该提到这一点,避免用户踩坑。 最后,总结一下os模块的重要性,以及建议用户在实际项目中多使用,同时结合其他模块如shutil和subprocess。可能还要给出一个完整的示例,展示几个常用函数的用法,这样用户可以直接参考。 检查一下有没有遗漏的重要函数,比如os.listdir,os.getcwd,os.chdir这些基本操作。另外,os.walk也是一个有用的方法,用于遍历目录树,可能需要提到,但简单带过,避免信息过载。 总体来说,结构应该是先介绍模块的作用,再分点详细说明各个功能,每个功能下给出例子,然后注意事项,最后示例代码。这样用户能有一个全面的了解,同时能立刻上手使用。</think>Python 的 `os` 模块是一个与操作系统交互的核心工具,提供了丰富的函数来操作文件系统、管理进程、访问环境变量等。以下是对 `os` 模块的详细介绍: -- ### **1. 核心功能** #### **文件与目录操作** - **创建/删除目录** ```python os.mkdir("new_dir") # 创建单层目录 os.makedirs("a/b/c") # 递归创建多层目录 os.rmdir("empty_dir") # 删除空目录 os.removedirs("a/b/c") # 递归删除空目录链 ``` - **文件操作** ```python os.rename("old.txt", "new.txt") # 重命名文件 os.remove("file.txt") # 删除文件 ``` - **目录遍历** ```python files = os.listdir(".") # 列出当前目录下的所有文件和子目录 for root, dirs, files in os.walk("/path"): # 递归遍历目录树 print(root, dirs, files) ``` --- #### **路径管理(`os.path` 子模块)** - **路径拼接与检查** ```python path = os.path.join("folder", "sub", "file.txt") # 自动处理路径分隔符(跨平台) exists = os.path.exists(path) # 检查路径是否存在 is_dir = os.path.isdir(path) # 是否是目录 ``` - **获取路径信息** ```python abs_path = os.path.abspath("file.txt") # 获取绝对路径 dir_name = os.path.dirname(abs_path) # 提取目录部分 file_name = os.path.basename(abs_path) # 提取文件名 ``` -- #### **系统命令与进程** - **执行系统命令** ```python os.system("ls -l") # 执行命令(返回退出状态码) output = os.popen("date").read() # 获取命令输出(建议用 `subprocess` 替代) ``` - **进程管理** ```python pid = os.getpid() # 获取当前进程ID os.kill(pid, signal.SIGTERM) # 终止进程(需导入 `signal` 模块) ``` --- #### **环境变量管理** ```python home_dir = os.environ.get("HOME") # 获取环境变量(如 $HOME) os.environ["MY_VAR"] = "value" # 设置临时环境变量(仅当前进程有效) ``` --- ### **2. 跨平台注意事项** - **路径分隔符** 使用 `os.path.join()` 代替硬编码的 `/` 或 `\`,避免系统兼容性问题。 - **系统差异** - 文件权限:`os.chmod()` 在 Unix 和 Windows 下的行为不同。 - 删除非空目录:`os.rmdir()` 只能删空目录,需用 `shutil.rmtree()` 删除非空目录。 --- ### **3. 实用示例** ```python import os # 获取当前工作目录 current_dir = os.getcwd() print("当前目录:", current_dir) # 创建并切换到新目录 os.makedirs("test_dir", exist_ok=True) os.chdir("test_dir") # 在目录中创建文件 with open("demo.txt", "w") as f: f.write("Hello, os module!") # 列出目录内容 print("目录内容:", os.listdir()) # 返回上级目录并删除测试目录 os.chdir("..") os.rmdir("test_dir") # 需确保目录为空 ``` --- ### **4. 替代或补充模块** - **`shutil`**:更高级的文件操作(如复制、压缩)。 - **`subprocess`**:更强大的系统命令执行(替代 `os.system`)。 - **`pathlib`**(Python 3.4+):面向对象的路径操作(更现代)。 --- `os` 模块是处理操作系统任务的基础工具,熟练掌握它能显著提升文件管理和系统交互的效率。建议结合具体需求查阅[官方文档](https://docs.python.org/3/library/os.html)深入学习!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值