【python库对比】路径专题 os.path和pathlib对比

专栏收录: python高频库对比
本专栏将持续更新在工程领域高频使用的python库之间的对比

文章概览:

  1. 简单介绍路径处理常用的python库及特点
  2. 对比os.path和pathlib的异同
  3. 结合代码示例说明两个库的差异.

补充: os.path和pathlib 高频使用接口见 os.path 和 pathlib高频使用接口及示例

1. 简介

Python 中处理路径的库有很多,其中一些常用的包括:

  1. os.path 模块:os.path 模块包含了许多用于处理路径的函数,如 os.path.dirname()、os.path.basename()、os.path.splitext() 等。

  2. pathlib 模块:pathlib 模块提供了面向对象的路径操作 API,使路径操作更加简洁和直观。它是 Python 3.4 引入的标准库。

  3. shutil 模块:shutil也提供了一些路径相关的函数,如shutil.getcwd(), 但是shutil主要用于文件操作,它提供了一些高级的文件操作函数,可以复制、移动、删除文件等。

  4. glob 模块glob 模块主要用于匹配文件路径,可以根据通配符来获取符合条件的文件路径列表。

  5. fnmatch 模块:fnmatch 模块提供了一种简单的方法来进行文件名的匹配,类似于 shell 中的通配符匹配。

这些库各有自己的侧重点,可以根据实际需求进行选择。其中os.pathpathlib使用场景非常相似,和其他几个模块的使用场景比较容易区分,文章将重点对比这2个库

2. os.pathpathlib对比

相同点:

  1. 功能: 无论是 os.path 还是 pathlib,它们都用于执行路径操作,如连接路径、获取路径的各个部分、检查路径是否存在等。

  2. 跨平台性: 两者都具有跨平台性,可以在不同操作系统上使用,因为它们会自动适应当前操作系统的路径分隔符。

不同点:

  1. API 风格: os.path 是基于函数调用的,而 pathlib 是基于对象的。os.path 模块中的函数接受字符串作为输入参数,而 pathlib 中的对象代表了路径,因此可以直接调用对象的方法来执行路径操作。

  2. 面向对象 vs 过程式编程: pathlib 提供了更面向对象的 API,这使得代码更加清晰和易于理解。而 os.path 则更加侧重于过程式编程,可能需要更多的函数调用来完成相同的任务。

  3. 可读性: pathlib 代码通常更加可读和易于维护,因为它提供了一种自然的方式来处理路径,而不需要拼接字符串或者调用多个函数。

  4. 新特性Path 类是在 Python 3.4 中引入的新特性,相比之下,os.path 已经存在了很长一段时间,因此 Path 类可能包含了更多现代化的特性和改进。

  5. 使用场景:

    • os.path适用于简单的路径操作,特别是在处理老代码或者需要与其他代码库兼容时。由于 os.path 是 Python 标准库的一部分,因此无需额外安装即可使用,对于一些简单的任务,os.path 通常足够了。
    • pathlib适用于需要更加清晰、简洁的路径操作,特别是在进行文件系统操作比较复杂的情况下。pathlib 提供了面向对象的 API,能够更好地组织和管理代码,使得代码更易读、易维护。在需要处理大量路径操作或者构建复杂路径时,pathlib 是一个更好的选择。

3. 代码示例

相同点:

  1. 功能:
import os
from pathlib import Path

# os.path
print("------ os.path--------")
os_path = os.path.join('folder', 'file.txt')
print(f"os_path is {os_path}")  # 输出:folder/file.txt
print(f"type of os_path is {type(os_path)}") # 输出:<class 'str'>
os_path_exists = os.path.exists(os_path)
print(f"is os_path_exists: {os_path_exists}")  # 输出:True 或 False


# pathlib
print("------ pathlib--------")
pathlib_path = Path('folder') / 'file.txt'
print(f"pathlib_path is {pathlib_path}")  # 输出:folder/file.txt
print(f"type of pathlib_path is {type(pathlib_path)}") # <class 'pathlib.WindowsPath'>
pathlib_path_exists = pathlib_path.exists()
print(f"is pathlib_path_exists: {pathlib_path_exists}")  # 输出:True 或 False

输出结果如下:他们输出的结果以及实现的功能是相同的
在这里插入图片描述

不同点:

1. API 风格 和 面向对象 vs 过程式编程:

pathlib 提供了更面向对象的 API,而 os.path 则更加侧重于过程式编程。

import os
from pathlib import Path

# 使用 os.path 进行过程式编程
folder = '/path/to/folder'
filename = 'file.txt'
os_path = os.path.join(folder, filename)

# 使用 pathlib 进行面向对象的操作
path = Path(folder)
path /= filename
pathlib_path = str(path)

print(f"os_path is {os_path}")  # 输出:/path/to/folder/file.txt
print(f"type of os_path is {type(os_path)}") # 输出:<class 'str'>

print(f"pathlib_path is {pathlib_path}")  # 输出:/path/to/folder/file.txt
print(f"type of pathlib_path is {type(pathlib_path)}") #输出:<class 'pathlib.WindowsPath'>

这个示例展示了使用 os.path 和 pathlib 时的编程风格差异。在 os.path 中,通常需要一系列函数来执行路径操作,而在 pathlib 中,可以通过操作对象本身来执行相同的操作,使得代码更加清晰和易于理解。

2. 可读性:

pathlib 代码通常更加可读和易于维护,因为它提供了一种自然的方式来处理路径,而不需要拼接字符串或者调用多个函数。

import os
from pathlib import Path

# 使用 os.path 拼接路径
folder = '/path/to/folder'
filename = 'file.txt'
full_path1 = os.path.join(folder, filename)

# 使用字符串拼接路径
full_path2 = folder + '/' + filename

# 使用 pathlib 进行路径操作
path = Path(folder) / filename
full_path3 = str(path)

print(full_path1)  # 输出:/path/to/folder/file.txt
print(full_path2)  # 输出:/path/to/folder/file.txt
print(full_path3)  # 输出:/path/to/folder/file.txt

这个示例展示了在构建路径时的不同方法。使用 os.path 或者字符串拼接路径可能会导致代码可读性相对较差,而使用 pathlib 则能够更清晰地表达路径的组织结构,使得代码更易读、易维护。

3. 可读性和使用场景:
当路径操作变得更加复杂时,可读性将成为一个关键问题。让我们通过一个更复杂的示例来说明使用 os.path 和 pathlib 时的可读性差异。

假设我们需要在指定目录下查找所有包含特定文件扩展名的文件,并将它们复制到另一个目录中。我们首先看看使用 os.path 的示例:

import os
import shutil

def find_and_copy_files(source_dir, dest_dir, extension):
    for root, dirs, files in os.walk(source_dir):
        for file in files:
            if file.endswith(extension):
                source_file = os.path.join(root, file)
                dest_file = os.path.join(dest_dir, file)
                shutil.copy(source_file, dest_file)

source_dir = '/path/to/source' # 需要路径替换成真实存在的路径
dest_dir = '/path/to/destination' # 需要路径替换成真实存在的路径
extension = '.txt' # 需要拷贝的文件类型

find_and_copy_files(source_dir, dest_dir, extension)

现在,让我们使用 pathlib 来重写相同的功能:

from pathlib import Path
import shutil

def find_and_copy_files(source_dir, dest_dir, extension):
    source_path = Path(source_dir)
    dest_path = Path(dest_dir)
    
    for source_file in source_path.glob('**/*' + extension):
        dest_file = dest_path / source_file.relative_to(source_path)
        shutil.copy(source_file, dest_file)

source_dir = '/path/to/source' # 需要路径替换成真实存在的路径
dest_dir = '/path/to/destination' # 需要路径替换成真实存在的路径
extension = '.txt' # 需要拷贝的文件类型

find_and_copy_files(source_dir, dest_dir, extension)

在这个示例中,尽管两种方法都能够完成相同的任务,但是使用 pathlib 使代码更加清晰和易于理解。使用 pathlib,我们可以直接在路径对象上调用方法,而不是使用 os.path 的一系列函数。同时,Path.glob() 方法使得查找特定扩展名的文件变得更加简洁和直观。这样的代码结构更易于理解和维护,尤其是在处理复杂的路径操作时。

  • 20
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
引用\[3\]中的程序演示了os.path模块中一些函数的功能和用法。如果要将os.path.split函数替换为pathlib模块中的相应函数,可以使用pathlib.Path对象的parent属性和name属性来实现相同的功能。 例如,将os.path.split('/root/workspace/python3_learning/test.py')替换为pathlib模块的代码可以是: ```python import pathlib path = pathlib.Path('/root/workspace/python3_learning/test.py') parent_dir = path.parent file_name = path.name print(parent_dir) # 输出:/root/workspace/python3_learning print(file_name) # 输出:test.py ``` 这样就可以获取到指定路径的目录和文件名,实现了os.path.split函数的功能。 #### 引用[.reference_title] - *1* *2* [Pythonos.path() 和 pathlib.Path()](https://blog.csdn.net/TomorrowAndTuture/article/details/113582588)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Python os.path模块常见函数用法(实例+详细注释)](https://blog.csdn.net/ccc369639963/article/details/124012787)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值