Python Pathlib模块简介

Introduction to the Python Pathlib Module

Python中的Pathlib模块简化了处理文件和文件夹的方式。 Python 3.4及更高版本提供Pathlib模块。 它结合了Python最好的文件系统模块,即os,os.path,glob等。

在Python中,大多数脚本都涉及与文件系统的交互。 因此,处理文件名和路径很重要。 为此,Python包含Pathlib模块,该模块包含执行与文件有关的任务的有用功能。 通过将文件系统路径表示为适当的对象,Pathlib提供了一种更易读,更轻松的方式来构建路径,并使我们能够编写可跨平台移植的代码。

在本文中,我们将借助各种示例详细研究Pathlib模块。

路径和目录的概念

在深入探讨Pathlib模块的细节之前,重要的是要理解两个不同的概念,即-路径和目录。

该路径用于标识文件。 该路径提供了一个可选的目录名称序列,该目录名称以最终文件名(包括文件扩展名)终止。 文件扩展名提供了有关文件格式/内容的一些信息。 Pathlib模块可以处理绝对路径和相对路径。 绝对路径从根目录开始,并指定完整的目录树,而顾名思义,相对路径是文件相对于另一个文件或目录(通常是当前目录)的路径。

目录代表路径的文件系统条目,其中包括文件名,创建时间,大小,所有者等。

Python中的Pathlib模块处理与路径相关的任务,例如根据文件名和其他路径构造新路径,检查路径的各种属性以及在特定路径下创建文件和文件夹。

如何使用Pathlib模块?

为了在脚本中方便地使用pathlib模块,我们使用以下命令导入其中的所有类:

1
from pathlib import *

首先,让我们使用以下代码分别检索当前的工作目录和主目录对象:

1
2
3
4
current_dir = Path.cwd()
home_dir = Path.home()
print(current_dir)
print(home_dir)

我们可以选择import pathlib而不是导入所有类。 在这种情况下,模块中所有后续使用类的地方都应加上pathlib作为前缀。

1
2
3
4
5
6
import pathlib

current_dir = pathlib.Path.cwd()
home_dir = pathlib.Path.home()
print(current_dir)
print(home_dir)

为什么要使用Pathlib模块?

如果您使用Python语言已有一段时间,您会想知道当osos.pathglob等模块已经可用时,Pathlib模块的必要性是什么? 这是完全有理由的关注。 让我们尝试通过一个示例来解决这个问题。

假设我们要在当前工作目录中创建一个名为" output / output.xlsx"的文件。 以下代码尝试使用os.path模块实现此目的。 为此,使用os.getcwdos.path.join函数。

1
2
3
import os
outpath = os.path.join(os.getcwd(), 'output')
outpath_file = os.path.join(outpath, 'out.xlsx')

交替,

1
outpath_file = os.pathjoin(os.path.join(os.getcwd(), 'output'),"out.xlsx")

尽管该代码可以正常工作,但它看起来很笨拙,不可读也不易于维护。 想象一下,如果我们想在多个嵌套目录中创建一个新文件,该代码将如何显示。

可以使用Pathlib模块重写相同的代码,如下所示:

1
2
from pathlib import Path
outpath = Path.cwd() / 'output' / 'output.xlsx'

这种格式更容易从心理上解析。 在Pathlib中,使用Path.cwd()函数获取当前的工作目录,并使用/运算符代替os.path.join将路径的各个部分组合为一个复合路径对象。 os.path模块中的功能嵌套模式由Pathlib模块的Path类代替,该类通过链接方法和属性表示路径。 /运算符的巧妙重载使代码易于阅读且易于维护。

Pathlib模块提供的方法的另一个好处是,创建了Path对象,而不是创建路径的字符串表示形式。 与使用表示路径的原始字符串一起使用时,此对象具有几种方便的方法,它们使工作变得更轻松。

在路径上执行操作

经典的os.path模块仅用于处理路径字符串。 要使用路径进行某些操作(例如,创建目录),我们需要os模块。 os模块提供了一组用于处理文件和目录的功能,例如:mkdir用于创建目录,rename重命名目录,getsize获取目录大小等等。

让我们使用os模块编写其中一些操作,然后使用Pathlib模块重写相同的代码。

使用os模块编写的示例代码:

1
2
if os.path.isdir(path):
    os.rmdir(path)

如果我们使用Pathlib模块的path对象实现相同的功能,则生成的代码将更具可读性,并且易于维护,如下所示:

1
2
if path.is_dir()
    path.rmdir()

os模块中找到与路径相关的实用程序很麻烦。 Pathlib模块通过用路径对象上的方法替换os模块的实用程序来解决此问题。 让我们用代码更好地理解它:

1
2
3
4
5
6
7
8
outpath = os.path.join(os.getcwd(), 'output')
outpath_tmp = os.path.join(os.getcwd(), 'output.tmp')
generate_data(output_tmp)

if os.path.getsize(output_tmp):
    os.rename(outpath_tmp, outpath)
else: # Nothing produced
    os.remove(outpath_tmp)

在此,函数generate_data()将文件路径作为参数并将数据写入另一个路径。 但是,如果未更改作为参数传递的文件,则自上次执行generate_data()函数以来,将生成一个空文件。 在这种情况下,空文件将替换为文件的先前版本。

变量outpath通过将当前工作目录与文件名"输出"联接来存储数据。 我们还创建了一个临时版本,名为outpath.tmp。 如果临时版本的大小不为零(表示它不是空文件),则将临时版本重命名为outpath,否则将删除临时版本并保留旧版本。

使用os模块,由于有多个对os.path.join()os.getcwd()等的调用,当字符串对象变得混乱时,操纵文件系统的路径。为避免此问题,Pathlib模块提供了一组可用于以下目的的类: 以更具可读性,更简单,面向对象的方式在路径上频繁使用的操作。

让我们尝试使用Pathlib模块重写以上代码。

1
2
3
4
5
6
7
8
9
10
11
from pathlib import Path

outpath = Path.cwd() / 'output'
outpath_tmp = Path.cwd() / 'output_tmp'

generate_data(output_tmp)

if outpath_tmp.stat().st_size:
    outpath_tmp.rename(outpath)
else: # Nothing produced
    Path_tmp.unlink()

使用Pathlib,os.getcwd()成为Path.cwd(),并且'/'运算符用于连接路径,并代替os.path.join。 使用Pathlib模块,可以使用运算符和方法调用以更简单的方式完成操作。

以下是常用的方法及其用法:

  • Path.cwd():代表当前工作目录的返回路径对象

  • Path.home():返回表示主目录的路径对象

  • Path.stat():返回有关路径的信息

  • Path.chmod():更改文件模式和权限

  • Path.glob(pattern):遍历路径表示的目录中给定的模式,产生任何类型的匹配文件

  • Path.mkdir():在给定路径下创建一个新目录

  • Path.open():打开由路径创建的文件

  • Path.rename():将文件或目录重命名为给定目标

  • Path.rmdir():删除空目录

  • Path.unlink():删除文件或符号链接

  • 生成跨平台路径

    路径在不同的操作系统中使用不同的约定。 Windows在文件夹名称之间使用反斜杠,而所有其他流行的操作系统在文件夹名称之间使用正斜杠。 如果要使python代码正常运行,而与底层操作系统无关,则需要处理特定于底层平台的不同约定。 Pathlib模块使使用文件路径更加容易。 在Pathlib中,无论操作系统如何,都可以使用正斜杠将路径或文件名传递给Path()对象。 其余的由Pathlib处理。

    1
    pathlib.Path.home() / 'python' / 'samples' / 'test_me.py'

    对于基础操作系统,Path()对象会将/转换为合适的斜线。 pathlib.Path可以代表Windows路径或Posix路径。 因此,Pathlib通过轻松处理路径解决了许多跨功能错误。

    获取路径信息

    在处理路径时,我们有兴趣查找文件/文件夹的父目录或跟随符号链接。 路径类具有几种方便的方法来执行此操作,因为路径的不同部分可以用作属性,包括以下内容:

  • drive:代表驱动器名称的字符串。 例如,PureWindowsPath('c:/Program Files/CSV').drive返回" C:"

  • parts:返回一个元组,该元组提供对路径组件的访问

  • name:没有任何目录的路径组件

  • parent:序列,提供对路径的逻辑祖先的访问

  • stem:没有后缀的最终路径组件

  • suffix:最终组件的文件扩展名

  • anchor:目录之前路径的一部分。 /用于创建子路径并模仿os.path.join的行为。

  • joinpath:将路径与提供的参数组合在一起

  • match(pattern):根据路径与提供的glob样式模式的匹配返回True / False

  • 在路径" /home/projects/stackabuse/python/sample.md"中:

  • path:-返回PosixPath('/ home / projects / stackabuse / python / sample.md')

  • path.parts:-返回('/','home','projects','stackabuse','python')

  • path.name:-返回" sample.md"

  • path.stem:-返回"样本"

  • path.suffix:-返回'.md'

  • path.parent:-返回PosixPath('/ home / projects / stackabuse / python')

  • path.parent.parent:-返回PosixPath('/ home / projects / stackabuse')

  • path.match('*.md'):返回True

  • PurePosixPath('/python').joinpath('edited_version'):返回('home / projects / stackabuse / python / edited_version

  • 地球模块的替代方案

    除了osos.path模块之外,Python中还提供了glob模块,该模块提供了与文件路径相关的utils。 glob模块的glob.glob功能用于查找与模式匹配的文件。

    1
    2
    3
    4
    from glob import glob

    top_xlsx_files = glob('*.xlsx')
    all_xlsx_files = glob('**/*.xlsx', recursive=True)

    pathlib还提供了glob实用程序:

    1
    2
    3
    4
    from pathlib import Path

    top_xlsx_files = Path.cwd().glob('*.xlsx')
    all_xlsx_files = Path.cwd().rglob('*.xlsx')

    Glob功能可用于Path对象。 因此,pathlib模块使复杂的任务变得更简单。

    使用Pathlib读写文件

    以下方法用于执行基本操作,例如读写文件:

  • read_text:以文本模式打开文件以读取文件的内容,并在读取后将其关闭

  • read_bytes:用于以二进制模式打开文件并以二进制形式返回内容,并在文件关闭后将其关闭。

  • write_text:用于打开文件并写入文本,以后将其关闭

  • write_bytes:完成后,用于将二进制数据写入文件并关闭文件

  • 让我们探讨Pathlib模块用于常见文件操作的用法。 以下示例用于读取文件的内容:

    1
    2
    path = pathlib.Path.cwd() / 'Pathlib.md'
    path.read_text()

    这里,Path对象上的read_text方法用于读取文件的内容。
    下面的示例用于以文本模式将数据写入文件:

    1
    2
    3
    from pathlib import Path

    p = Path('sample_text_file') p.write_text('Sample to write data to a file')

    因此,在Pathlib模块中,通过将路径作为对象,可以使我们对文件系统的对象执行有用的操作,包括创建或删除目录,查找特定文件,移动文件等许多路径操作。

    结论

    总而言之,Pathlib模块提供了大量丰富而有用的功能,可用于执行各种与路径相关的操作。 另外一个优点是,库在基础操作系统之间是一致的。