专栏收录: python高频库对比
本专栏将持续更新在工程领域高频使用的python库之间的对比
文章概览:
- 简单介绍路径处理常用的python库及特点
- 对比os.path和pathlib的异同
- 结合代码示例说明两个库的差异.
补充: os.path和pathlib 高频使用接口见 os.path 和 pathlib高频使用接口及示例
1. 简介
Python 中处理路径的库有很多,其中一些常用的包括:
-
os.path 模块:os.path 模块包含了许多用于处理路径的函数,如 os.path.dirname()、os.path.basename()、os.path.splitext() 等。
-
pathlib 模块:pathlib 模块提供了面向对象的路径操作 API,使路径操作更加简洁和直观。它是 Python 3.4 引入的标准库。
-
shutil 模块:shutil也提供了一些路径相关的函数,如shutil.getcwd(),
但是shutil主要用于文件操作
,它提供了一些高级的文件操作函数,可以复制、移动、删除文件等。 -
glob 模块:
glob 模块主要用于匹配文件路径
,可以根据通配符来获取符合条件的文件路径列表。 -
fnmatch 模块:fnmatch 模块提供了一种简单的方法来进行文件名的匹配,类似于 shell 中的通配符匹配。
这些库各有自己的侧重点,可以根据实际需求进行选择。其中os.path
和pathlib
使用场景非常相似,和其他几个模块的使用场景比较容易区分,文章将重点对比这2个库
2. os.path
和pathlib
对比
相同点:
-
功能: 无论是 os.path 还是 pathlib,它们都用于执行路径操作,如连接路径、获取路径的各个部分、检查路径是否存在等。
-
跨平台性: 两者都具有跨平台性,可以在不同操作系统上使用,因为它们会自动适应当前操作系统的路径分隔符。
不同点:
-
API 风格: os.path 是基于函数调用的,而 pathlib 是基于对象的。os.path 模块中的函数接受字符串作为输入参数,而 pathlib 中的对象代表了路径,因此可以直接调用对象的方法来执行路径操作。
-
面向对象 vs 过程式编程: pathlib 提供了更面向对象的 API,这使得代码更加清晰和易于理解。而 os.path 则更加侧重于过程式编程,可能需要更多的函数调用来完成相同的任务。
-
可读性: pathlib 代码通常更加可读和易于维护,因为它提供了一种自然的方式来处理路径,而不需要拼接字符串或者调用多个函数。
-
新特性:
Path
类是在 Python 3.4 中引入的新特性,相比之下,os.path
已经存在了很长一段时间,因此Path
类可能包含了更多现代化的特性和改进。 -
使用场景:
- os.path适用于简单的路径操作,特别是在处理老代码或者需要与其他代码库兼容时。由于 os.path 是 Python 标准库的一部分,因此无需额外安装即可使用,对于一些简单的任务,os.path 通常足够了。
- pathlib适用于需要更加清晰、简洁的路径操作,特别是在进行文件系统操作比较复杂的情况下。pathlib 提供了面向对象的 API,能够更好地组织和管理代码,使得代码更易读、易维护。在需要处理大量路径操作或者构建复杂路径时,pathlib 是一个更好的选择。
3. 代码示例
相同点:
- 功能:
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() 方法使得查找特定扩展名的文件变得更加简洁和直观。这样的代码结构更易于理解和维护,尤其是在处理复杂的路径操作时。