zoukankan      html  css  js  c++  java
  • 比文件操作os库更优异的标准库pathlib

    pathlib 库从 python3.4 开始作为内置库,到 python3.6 已经比较成熟。相比于老式的 os.path 有几个优势:

    1. 老的路径操作函数管理比较混乱,有的是导入 os, 有的又是在 os.path 当中,而新的用法统一可以用 pathlib 管理。
    2. 老用法在处理不同操作系统 win,mac 以及 linux 之间很吃力。换了操作系统常常要改代码,还经常需要进行一些额外操作。
    3. 老用法主要是函数形式,返回的数据类型通常是字符串。但是路径和字符串并不等价,所以在使用 os 操作路径的时候常常还要引入其他类库协助操作。新用法是面向对象,处理起来更灵活方便。
    4. pathlib 简化了很多操作,用起来更轻松。

    例如:
    os 中获取文件的绝对路径:os.join(os.getcwd(), file_name)
    pathlib中获取文件的绝对路径:pathilb.Path().resolve()

    os 中获取上一级目录:os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
    pathlib中获取上一级目录:pathilb.Path().parents

    此外还有一个写法的优势,我们可以看到os的写法是函数式的,由内到外需要一层一层剥开,而pathlib是链式写法,从左到右理解,相较于从内到外理解更加清晰。

    生成路径

    根据路径生成对象

    from pathlib import Path
    path = Path('/home/ljk')
    >>> path
    PosixPath('/home/ljk')
    

    获取当前路径

    >>> path = Path.cwd()
    >>> path
    PosixPath('/home/ljk')
    
    

    路径拼接

    >>> new_path = path / "Desktop"
    >>> new_path
    PosixPath('/home/ljk/Desktop')
    

    路径自身判断

    path = Path('/home/ljk')
    

    判断当前路径是否存在,即当前路径是文件或目录

    >>> path.exists()
    True
    

    判断当前路径是否为文件夹

    >>> path.is_dir()
    True
    

    判断当前路径是否为文件

    >>> path.is_file()
    False
    

    判断路径是否为绝对路径

    >>> path.is_absolute()
    True
    

    判断路径是否满足正则表达
    path.match(pattern)

    列出路径下文件

    path = Path('/home/ljk')

    获取路径下的所有符合filename的文件,返回一个generator

    >>> files = path.glob("*.py")
    >>> files
    <generator object Path.glob at 0x7f0b673fae58>
    
    

    获取路径下包括所有子文件夹的的所有符合filename的文件,返回一个generator

    >>> files = path.rglob("*.py")
    >>> files
    <generator object Path.rglob at 0x7f0b673fade0>
    

    当path为文件夹时,通过yield产生path文件夹下的所有文件、文件夹路径的迭代器

    >>> path.iterdir() 
    <generator object Path.iterdir at 0x7f0b673fad68>
    >>> files = path.iterdir() 
    >>> for file in files:
    ...     print(file)
    ... 
    /home/ljk/.gtkrc-2.0
    /home/ljk/.python_history-22040.tmp
    /home/ljk/.gphoto
    /home/ljk/.gitconfig
    

    路径属性

    path = Path('/home/ljk/a.txt')

    获取文件的名字

    >>> path.name
    'a.txt'
    

    获取文件名,不带后缀

    >>> path.stem
    'a'
    

    获取文件的后缀

    >>> path.suffix
    '.txt'
    

    获取文件的上级目录

    >>> path.parent
    PosixPath('/home/ljk')
    

    获取所有上级目录

    >>> parents = path.parents
    >>> parents[0]
    PosixPath('/home/ljk')
    >>> parents[1]
    PosixPath('/home')
    
    

    获取文件的根目录

    >>> path.root
    '/'
    

    将路径分割成元祖

    >>> path.parts
    ('/', 'home', 'ljk', 'a.txt')
    

    获取当前文件的信息

    >>> path.stat()
    os.stat_result(st_mode=33188, st_ino=5375436, st_dev=2051, st_nlink=1, st_uid=1000, st_gid=1000, st_size=0, st_atime=1638973232, st_mtime=1638973232, st_ctime=1638973232)
    

    返回文件的绝对路径

    >>> path.resolve()
    PosixPath('/home/ljk/a.txt')
    

    返回文件家目录

    >>> path.home()
    PosixPath('/home/ljk')
    

    文件修改

    当target是string时,重命名文件或文件夹;当target是Path时,重命名并移动文件或文件夹

    path.rename(target)
    

    重命名当前文件或文件夹,如果target所指示的文件或文件夹已存在,则覆盖原文件

    path.replace(target)
    

    path为空文件夹的时候,删除该文件夹

    path.rmdir()
    

    删除文件或目录,目录非空触发异常

    path.unlink()  
    

    根据路径创建文件夹,parents=True时,会依次创建路径中间缺少的文件夹

    path.mkdir(parents=True)
    

    打开文件,底层调用open

    path.open()
    

    其他读写的操作
    .read_text(): 找到对应的路径然后打开文件,读成str格式。等同open操作文件的"r"格式。
    .read_bytes(): 读取字节流的方式。等同open操作文件的"rb"格式。
    .write_text(): 文件的写的操作,等同open操作文件的"w"格式。
    .write_bytes(): 文件的写的操作,等同open操作文件的"wb"格式。

    官方文档

    pathlib 官方文档:
    https://docs.python.org/3/library/pathlib.html

  • 相关阅读:
    微信支付接口之心酸
    分页之辛酸史
    谈谈面试经历
    Linux(Ubuntu 14.0)
    Android(Xamarin)之旅(五)
    css:befor :after 伪元素的妙用
    js设计模式-代理模式
    html页面元素命名参考
    html5-meta标签和搜索引擎
    iframe框架加载完成后执行函数
  • 原文地址:https://www.cnblogs.com/goldsunshine/p/15664821.html
Copyright © 2011-2022 走看看