• python pathlib模块详解


    借鉴于 pathlib 官方文档 用于自己学习和记录
    使用 pathlib 模块基本可以代替 os.path 来处理路径。它采用了完全面向对象的编程方式。
    其包含六个类,图片如下:

    但是大体有两类:

    • pure paths 路径计算操作没有IO功能
    • concrete paths 路径计算操作和IO功能

    从上图可以看出:PurePath 类是所有类的基类

    基础使用

    列出子目录
    >>> p = Path('.')
    >>> [x for x in p.iterdir() if x.is_dir()]
    [PosixPath('.hg'), PosixPath('docs'), PosixPath('dist'),
     PosixPath('__pycache__'), PosixPath('build')]
    

    ###### 列出指定类型的文件
    list(p.glob('**/*.py'))
    

    ###### 路径拼接 在目录树中移动 使用`/`来拼接路径 ```python >>> p = Path('/etc') >>> q = p / 'init.d' / 'reboot' >>> q WindowsPath('/etc/init.d/reboot') >>> q.resolve() WindowsPath('C:/etc/init.d/reboot') >>> print(q) \etc\init.d\reboot >>> print(q.resolve()) C:\etc\init.d\reboot >>> ```

    ###### 查询路径的属性 ```python >>> q.exists() # Unix 里面这个会返回True False >>> q.is_dir() False >>> ```
    ###### 打开一个文件 ```python >>> with q.open() as f: f.readline() ... FileNotFoundError: [Errno 2] No such file or directory # 如果不存在则报错 ```
    #### Pure paths 纯路径 纯路径对象提供了不实际访问文件系统的路径处理操作。有三种方式来访问这些类。
    ###### class pathlib.**PurePath(\*pathsegments)**
    >>> PurePath('setup.py')      
    PurePosixPath('setup.py')  # Running on a Unix machine
    PureWindowsPath('setup.py')  # Running on a Windows machine
    
    # 也可以用以下方式添加路径
    >>> PurePath('foo', 'some/path', 'bar')
    PurePosixPath('foo/some/path/bar')  # Running on a Unix machine
    PureWindowsPath('foo/some/path/bar')  # Running on a Windows machine
    >>> PurePath(Path('foo'), Path('bar'))
    PurePosixPath('foo/bar')  # Running on a Unix machine
    PureWindowsPath('foo/bar')  # Running on a Windows machine
    

    参数为空时,返回当前路径

    >>> PurePath()
    PurePosixPath('.')  # Running on a Unix machine
    PureWindowsPath('.')  # Running on a Windows machine
    

    当同时指定多个绝对路径,则使用最后一个

    >>> PurePath('/etc', '/usr', 'lib64')
    PurePosixPath('/usr/lib64')
    >>> PureWindowsPath('c:/Windows', 'd:bar')
    PureWindowsPath('d:bar')
    

    在 Windows 路径中,改变本地根目录并不会丢弃之前盘符的设置

    >>> PureWindowsPath('c:/Windows', '/Program Files')
    PureWindowsPath('c:/Program Files')
    

    双斜线和单独的点都会被消除,但是双点 (‘..’) 不会,以防改变符号链接的含义。

    >>> PurePath('foo//bar')
    PurePosixPath('foo/bar')
    >>> PurePath('foo/./bar')
    PurePosixPath('foo/bar')
    >>> PurePath('foo/../bar')
    PurePosixPath('foo/../bar')
    

    ###### class pathlib.**PurePosixPath(\*pathsegments)**
    >>> PurePosixPath('/etc')
    PurePosixPath('/etc')
    

    其他操作与 PurePath 相同

    class pathlib.PureWindowsPath(*pathsegments)
    >>> PureWindowsPath('c:/Program Files/')
    PureWindowsPath('c:/Program Files')
    

    其他操作与 PurePath 相同

    ** 无论你正运行什么系统,你都可以实例化这些类,因为它们提供的操作不做任何系统调用 **


    ##### 通用性质

    路径是不可变并可哈希的。相同风格的路径可以排序与比较。

    >>> PurePosixPath('foo') == PurePosixPath('FOO')
    False
    >>> PureWindowsPath('foo') == PureWindowsPath('FOO')
    True
    >>> PureWindowsPath('FOO') in { PureWindowsPath('foo') }
    True
    >>> PureWindowsPath('C:') < PureWindowsPath('d:')
    True
    

    不同风格的路径比较得到不等的结果并且无法被排序:

    >>> PureWindowsPath('foo') == PurePosixPath('foo')
    False
    >>> PureWindowsPath('foo') < PurePosixPath('foo')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: '<' not supported between instances of 'PureWindowsPath' and 'PurePosixPath'
    

    ##### 运算符

    斜杠操作符有助于操作子路径

    >>> p = PurePath('/etc')
    >>> p
    PurePosixPath('/etc')
    >>> p / 'init.d' / 'apache2'
    PurePosixPath('/etc/init.d/apache2')
    >>> q = PurePath('bin')
    >>> '/usr' / q
    PurePosixPath('/usr/bin')
    

    文件对象可用于任何接受 os.PathLike 接口实现的地方

    >>> import os
    >>> p = PurePath('/etc')
    >>> os.fspath(p)
    '/etc'
    

    路径的字符串表示法

    >>> p = PurePath('/etc')
    >>> str(p)
    '/etc'
    >>> p = PureWindowsPath('c:/Program Files')
    >>> str(p)
    'c:\\Program Files'
    >>> bytes(p)
    b'/etc'  # 只推荐在 Unix下调用bytes
    

    ##### 访问路径独立组件

    可以使用以下特征属性:

    PurePath.parts

    返回一个元组,可以访问路径的多个组件

    >>> p = PurePath('/usr/bin/python3')
    >>> p.parts
    ('/', 'usr', 'bin', 'python3')
    
    >>> p = PureWindowsPath('c:/Program Files/PSF')
    >>> p.parts
    ('c:\\', 'Program Files', 'PSF')
    

    ##### 方法和特征属性

    可以使用以下特征属性:

    PurePath.drive

    一个表示驱动器盘符或命名的字符串

    >>> PureWindowsPath('c:/Program Files/').drive
    'c:'
    >>> PureWindowsPath('/Program Files/').drive
    ''
    >>> PurePosixPath('/etc').drive
    ''
    

    ###### PurePath.**root**

    一个表示(本地或全局)的字符串

    >>> PureWindowsPath('c:/Program Files/').root
    '\\'
    >>> PureWindowsPath('c:Program Files/').root
    ''
    >>> PurePosixPath('/etc').root
    '/'
    

    ###### PurePath.**anchor**

    驱动器和根的联合

    >>> PureWindowsPath('c:/Program Files/').anchor
    'c:\\'
    >>> PureWindowsPath('c:Program Files/').anchor
    'c:'
    >>> PurePosixPath('/etc').anchor
    '/'
    

    ###### PurePath.**parents**

    一个不可变序列,提供对路径逻辑祖先的访问

    >>> p = PureWindowsPath('c:/foo/bar/setup.py')
    >>> p.parents[0]
    PureWindowsPath('c:/foo/bar')
    >>> p.parents[1]
    PureWindowsPath('c:/foo')
    >>> p.parents[2]
    PureWindowsPath('c:/')
    

    ###### PurePath.**parent**

    返回当前路径的父路径

    >>> p = PurePosixPath('/a/b/c/d')
    >>> p.parent
    PurePosixPath('/a/b/c')
    >>> p = PurePosixPath('/')
    >>> p.parent
    PurePosixPath('/')
    >>> p = PurePosixPath('.')
    >>> p.parent
    PurePosixPath('.')
    >>> p = PurePosixPath('foo/..')
    >>> p.parent
    PurePosixPath('foo')
    

    ** 如果想要向上移动任意文件系统路径,推荐先使用 Path.resolve() 来解析符号链接以及消除 ".." 组件。**


    PurePath.name

    一个表示最后路径组件的字符串,排除了驱动器与根目录

    >>> PurePosixPath('my/library/setup.py').name
    'setup.py'
    

    ###### PurePath.**suffix**

    最后一个组件的文件扩展名

    >>> PurePosixPath('my/library/setup.py').suffix
    '.py'
    >>> PurePosixPath('my/library.tar.gz').suffix
    '.gz'
    >>> PurePosixPath('my/library').suffix
    ''
    

    ###### PurePath.**suffixes**

    路径的文件扩展名列表

    >>> PurePosixPath('my/library.tar.gar').suffixes
    ['.tar', '.gar']
    >>> PurePosixPath('my/library.tar.gz').suffixes
    ['.tar', '.gz']
    >>> PurePosixPath('my/library').suffixes
    []
    

    ###### PurePath.**stem**

    最后一个路径组件,除去后缀

    >>> PurePosixPath('my/library.tar.gz').stem
    'library.tar'
    >>> PurePosixPath('my/library.tar').stem
    'library'
    >>> PurePosixPath('my/library').stem
    'library'
    

    ###### PurePath.**as_posix()**

    返回使用正斜杠(/)的路径字符串

    >>> p = PureWindowsPath('c:\\windows')
    >>> str(p)
    'c:\\windows'
    >>> p.as_posix()
    'c:/windows'
    

    ###### PurePath.**as_uri()**

    将路径表示为 file URL的格式。如果并非绝对路径,抛出 ValueError。

    >>> p = PurePosixPath('/etc/passwd')
    >>> p.as_uri()
    'file:///etc/passwd'
    >>> p = PureWindowsPath('c:/Windows')
    >>> p.as_uri()
    'file:///c:/Windows'
    

    ###### PurePath.**is_absolute()**

    返回此路径是否为绝对路径。如果路径同时拥有驱动器符与根路径(如果风格允许)则将被认作绝对路径。

    >>> PurePosixPath('/a/b').is_absolute()
    True
    >>> PurePosixPath('a/b').is_absolute()
    False
    
    >>> PureWindowsPath('c:/a/b').is_absolute()
    True
    >>> PureWindowsPath('/a/b').is_absolute()
    False
    >>> PureWindowsPath('c:').is_absolute()
    False
    

    ###### PurePath.**is_reserved()**

    PureWindowsPath,如果路径是被 Windows 保留的则返回 True,否则 False。在 PurePosixPath,总是返回 False。

    >>> PureWindowsPath('nul').is_reserved()
    True
    >>> PurePosixPath('nul').is_reserved()
    False
    

    ###### PurePath.**joinpath(\*other)**

    调用此方法等同于将每个 other 参数中的项目连接在一起

    >>> PurePosixPath('/etc').joinpath('passwd')
    PurePosixPath('/etc/passwd')
    >>> PurePosixPath('/etc').joinpath(PurePosixPath('passwd'))
    PurePosixPath('/etc/passwd')
    >>> PurePosixPath('/etc').joinpath('init.d', 'apache2')
    PurePosixPath('/etc/init.d/apache2')
    >>> PureWindowsPath('c:').joinpath('/Program Files')
    PureWindowsPath('c:/Program Files')
    

    ###### PurePath.**match(pattern)**

    将此路径与提供的通配符风格的模式匹配。如果匹配成功则返回 True,否则返回 False。
    如果 pattern 是相对的,则路径可以是相对路径或绝对路径,并且匹配是从右侧完成的,例如:

    >>> PurePath('a/b.py').match('*.py')
    True
    >>> PurePath('/a/b/c.py').match('b/*.py')
    True
    >>> PurePath('/a/b/c.py').match('a/*.py')
    False
    

    如果 pattern 是绝对的,则路径必须是绝对的,并且路径必须完全匹配:

    >>> PurePath('/a.py').match('/*.py')
    True
    >>> PurePath('a/b.py').match('/*.py')
    False
    
    # 大小写的区分
    >>> PureWindowsPath('b.py').match('*.PY')
    True
    

    ###### PurePath.**relative_to(\*other)** 计算此路径相对 other 表示路径的版本。如果不可计算,则抛出 ValueError: ```python >>> p = PurePosixPath('/etc/passwd') >>> p.relative_to('/') PurePosixPath('etc/passwd') >>> p.relative_to('/etc') PurePosixPath('passwd') >>> p.relative_to('/usr') Traceback (most recent call last): File "", line 1, in File "pathlib.py", line 694, in relative_to .format(str(self), str(formatted))) ValueError: '/etc/passwd' does not start with '/usr' ```
    ###### PurePath.**with_name(name)**

    返回一个新的路径并修改 name。如果原本路径没有 nameValueError 被抛出

    >>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
    >>> p.with_name('setup.py')
    PureWindowsPath('c:/Downloads/setup.py')
    >>> p = PureWindowsPath('c:/')
    >>> p.with_name('setup.py')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/home/antoine/cpython/default/Lib/pathlib.py", line 751, in with_name
        raise ValueError("%r has an empty name" % (self,))
    ValueError: PureWindowsPath('c:/') has an empty name
    

    ###### PurePath.**with_suffix(suffix)** 返回一个新的路径并修改后缀 suffix。如果原本的路径没有后缀,新的 suffix 则被追加以代替。如果 suffix 是空字符串,则原本的后缀被移除: ```python >>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz') >>> p.with_suffix('.bz2') PureWindowsPath('c:/Downloads/pathlib.tar.bz2') >>> p = PureWindowsPath('README') >>> p.with_suffix('.txt') PureWindowsPath('README.txt') >>> p = PureWindowsPath('README.txt') >>> p.with_suffix('') PureWindowsPath('README') ```
    ##### Path 具体路径

    具体路径是纯路径的子类。除了后者提供的操作之外,它们还提供了对路径对象进行系统调用的方法。
    有以下三种方法可以实例化具体路径:

    class pathlib.Path(*pathsegments)

    一个 PurePath 的子类,此类以当前系统的路径风格表示路径(实例化为 PosixPath 或 WindowsPath):

    >>> Path('setup.py')
    PosixPath('setup.py')  # Unix 系统
    WindowsPath('setup.py')  # Windows 系统
    

    ###### class pathlib.**PosixPath(*pathsegments)**
    >>> PosixPath('/etc')
    PosixPath('/etc')
    

    ###### class pathlib.**WindowsPath(*pathsegments)**
    >>> WindowsPath('c:/Program Files/')
    WindowsPath('c:/Program Files')
    

    方法

    除纯路径方法外,具体路径还提供以下方法。

    classmethod Path.cwd()

    返回一个新的表示当前目录的路径对象,和 os.getcwd() 返回的相同

    >>> Path.cwd()
    PosixPath('/home/antoine/pathlib')
    

    ###### classmethod Path.**home()**

    返回一个表示当前用户根目录的新路径对象,和 os.path.expanduser() 构造含 ~ 路径返回的相同

    >>> Path.home()
    PosixPath('/home/antoine')
    

    ###### Path.**stat()**

    返回此路径的信息(类似于 os.stat())。

    >>> p = Path('setup.py')
    >>> p.stat().st_size
    956
    >>> p.stat().st_mtime
    1327883547.852554
    

    ###### Path.**chmod(mode)**

    改变文件的模式和权限,和 os.chmod() 一样:

    >>> p = Path('setup.py')
    >>> p.stat().st_mode
    33277
    >>> p.chmod(0o444)
    >>> p.stat().st_mode
    33060
    

    ###### Path.**exists()**

    此路径是否指向一个已存在的文件或目录

    >>> Path('.').exists()
    True
    >>> Path('setup.py').exists()
    True
    >>> Path('/etc').exists()
    True
    >>> Path('nonexistentfile').exists()
    False
    

    ###### Path.**expanduser()**

    返回展开了根目录与~的构造,和 os.path.expanduser() 一样:

    >>> p = PosixPath('~/films/Monty Python')
    >>> p.expanduser()
    PosixPath('/home/eric/films/Monty Python')
    

    ###### Path.**glob(pattern)**

    生成所有匹配 pattern 的文件

    >>> sorted(Path('.').glob('*.py'))
    [PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]
    >>> sorted(Path('.').glob('*/*.py'))
    [PosixPath('docs/conf.py')]
    

    “**” 模式表示 此目录以及所有子目录

    >>> sorted(Path('.').glob('**/*.py'))
    [PosixPath('build/lib/pathlib.py'),
     PosixPath('docs/conf.py'),
     PosixPath('pathlib.py'),
     PosixPath('setup.py'),
     PosixPath('test_pathlib.py')]
    

    ###### Path.**group()**

    返回拥有此文件的用户组。

    Path.is_dir()

    如果路径指向一个目录(或者一个指向目录的符号链接)则返回 True,如果指向其他类型的文件则返回 False
    当路径不存在或者是一个破损的符号链接时也会返回 False

    Path.is_file()

    如果路径指向一个正常的文件(或者一个指向正常文件的符号链接)则返回 True,如果指向其他类型的文件则返回 False。
    当路径不存在或者是一个破损的符号链接时也会返回 False

    如果路径指向符号链接则返回 True, 否则 False。
    如果路径不存在也返回 False

    Path.is_socket()

    如果路径指向一个 Unix socket 文件(或者指向 Unix socket 文件的符号链接)则返回 True,如果指向其他类型的文件则返回 False。
    当路径不存在或者是一个破损的符号链接时也会返回 False

    Path.is_fifo()

    如果路径指向一个先进先出存储(或者指向先进先出存储的符号链接)则返回 True ,指向其他类型的文件则返回 False。
    当路径不存在或者是一个破损的符号链接时也会返回 False

    Path.is_block_device()

    如果文件指向一个块设备(或者指向块设备的符号链接)则返回 True,指向其他类型的文件则返回 False。
    当路径不存在或者是一个破损的符号链接时也会返回 False

    Path.is_char_device()

    如果路径指向一个字符设备(或指向字符设备的符号链接)则返回 True,指向其他类型的文件则返回 False。
    当路径不存在或者是一个破损的符号链接时也会返回 False

    Path.iterdir()

    当路径指向一个目录时,产生该路径下的对象的路径

    >>> p = Path('docs')
    >>> for child in p.iterdir(): child
    ...
    PosixPath('docs/conf.py')
    PosixPath('docs/_templates')
    PosixPath('docs/make.bat')
    PosixPath('docs/index.rst')
    PosixPath('docs/_build')
    PosixPath('docs/_static')
    PosixPath('docs/Makefile')
    

    ###### Path.**mkdir(mode=0o777, parents=False, exist_ok=False)**

    创建目录

    Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)

    打开路径指向的文件

    >>> p = Path('setup.py')
    >>> with p.open() as f:
    ...     f.readline()
    ...
    '#!/usr/bin/env python3\n'
    

    ###### Path.**owner()**

    返回拥有此文件的用户名。如果文件的 UID 无法在系统数据库中找到,则抛出 KeyError。

    Path.read_bytes()

    以字节对象的形式返回路径指向的文件的二进制内容:

    >>> p = Path('my_binary_file')
    >>> p.write_bytes(b'Binary file contents')
    20
    >>> p.read_bytes()
    b'Binary file contents'
    

    ###### Path.**read_text(encoding=None, errors=None)**

    以字符串形式返回路径指向的文件的解码后文本内容

    >>> p = Path('my_text_file')
    >>> p.write_text('Text file contents')
    18
    >>> p.read_text()
    'Text file contents'
    

    ###### Path.**rename(target)**

    使用给定的 target 将文件重命名

    >>> p = Path('foo')
    >>> p.open('w').write('some text')
    9
    >>> target = Path('bar')
    >>> p.rename(target)
    >>> target.open().read()
    'some text'
    

    ###### Path.**replace(target)**

    使用给定的 target 重命名文件或目录。

    Path.resolve(target)

    将路径绝对化,解析任何符号链接。返回新的路径对象:

    >>> p = Path()
    >>> p
    PosixPath('.')
    >>> p.resolve()
    PosixPath('/home/antoine/pathlib')
    
    # ‘..’组件也会被消除
    >>> p = Path('docs/../setup.py')
    >>> p.resolve()
    PosixPath('/home/antoine/pathlib/setup.py')
    

    ###### Path.**rglob(pattern)**

    与给定模式前面添加'**'一样调用 Path.glob():

    >>> sorted(Path().rglob("*.py"))
    [PosixPath('build/lib/pathlib.py'),
     PosixPath('docs/conf.py'),
     PosixPath('pathlib.py'),
     PosixPath('setup.py'),
     PosixPath('test_pathlib.py')]
    

    ###### Path.**rmdir()**

    移除此目录。此目录必须为空的。

    Path.samefile(other_path)

    返回此目录是否指向与可能是字符串或者另一个路径对象的 other_path 相同的文件。

    >>> p = Path('spam')
    >>> q = Path('eggs')
    >>> p.samefile(q)
    False
    >>> p.samefile('spam')
    True
    

    ###### Path.**symlink_to(target, target_is_directory=False)**

    将此路径创建为指向 target 的符号链接。在 Windows 下,如果链接的目标是一个目录则 target_is_directory 必须为 true (默认为 False)。在 POSIX 下, target_is_directory 的值将被忽略。

    >>> p = Path('mylink')
    >>> p.symlink_to('setup.py')
    >>> p.resolve()
    PosixPath('/home/antoine/pathlib/setup.py')
    >>> p.stat().st_size
    956
    >>> p.lstat().st_size
    8
    

    ###### Path.**touch(mode=0o666, exist_ok=True)**

    将给定的路径创建为文件。
    如果给出了 mode 它将与当前进程的 umask 值合并以确定文件的模式和访问标志。如果文件已经存在,则当 exist_ok 为 true 则函数仍会成功(并且将它的修改事件更新为当前事件),否则抛出 FileExistsError。

    移除此文件或符号链接。如果路径指向目录,则用 Path.rmdir() 代替。

    Path.write_bytes(data)

    将文件以二进制模式打开,写入 data 并关闭:

    >>> p = Path('my_binary_file')
    >>> p.write_bytes(b'Binary file contents')
    20
    >>> p.read_bytes()
    b'Binary file contents'
    

    ###### Path.**write_text(data, encoding=None, errors=None)**

    将文件以文本模式打开,写入 data 并关闭:

    >>> p = Path('my_text_file')
    >>> p.write_text('Text file contents')
    18
    >>> p.read_text()
    'Text file contents'
    
  • 相关阅读:
    Sql获取当前用户可以访问的数据库名
    MSChart中转义符
    PhoneGap 调用activity中的方法
    爬hao123应对不同页面不同编码
    C#调用脚本语言(三) IronJS 与 IronLua 简单方法性能比较
    Sailfish预研结果
    phonegap开发者需要注意喽,小心图片外链
    IOS 5 解析Json
    C#调用脚本语言(二) IronJS基本语法
    使用phonegap,进行页面跳转
  • 原文地址:https://www.cnblogs.com/During/p/10841219.html
Copyright © 2020-2023  润新知