Python模块 —— pathlib操作系统路径及文件名

文章目录

一、结构介绍

inherit
inherit
inherit
inherit
inherit
inherit
inherit
PurePosixPath
PurePath
Path
PureWindowsPath
PosixPath
WindowsPath

  pathlib是跨平台的、面向对象的路径操作模块,可适用于不同的操作系统,其操作对象是各种操作系统中使用的路径(包括绝对路径和相对路径),pathlib有两个主要的类,分别为PurePath和Path。

1.1 PurePath

   PurePath访问市级文件系统的“纯路径”,只负责对路径字符串执行操作。PurePath有两个子类,即PurePosixPath和PathWindowsPath,前者用于操作UNIX(包括
Mac OS X)风格的路径,后者用于操作Windows风格的路径。

1.2 Path

  Path访问实际文件系统的“真正路径”,Path对象可用于判断对应的文件是否存在、是否为文件、是否为目录等。有两个子类,即PosixPath和WindowsPath,前者用于操作UNIX(包括
Mac OS X)风格的路径,后者用于操作Windows风格的路径。

1.3 PurePath和Path的区别

  Path 是 PurePath 的子类,除了支持 PurePath 的各种操作、属性和方法之外,还会真正访问底层的文件系统,包括判断 Path
对应的路径是否存在,获取 Path 对应路径的各种属性(如是否只读、是文件还是文件夹等),甚至可以对文件进行读写。

  PurePath 和 Path 最根本的区别在于,PurePath 处理的仅是字符串,而 Path 则会真正访问底层的文件路径,因此它提供了属性和方法来访问底层的文件系统。

1.4 UNIX 和 Windows 风格路径区别

  UNIX 风格的路径和 Windows 风格路径的主要区别在于根路径和路径分隔符,UNIX 风格路径的根路径是斜杠(/),而 Windows
风格路径的根路径是盘符(c:);UNIX 风格的路径的分隔符是斜杠(/),而 Windows 风格路径的分隔符是反斜杠(\)。

注意:

  考虑到操作系统的不同,在使用 PurePath 类时,如果在 UNIX 或 Mac OS X 系统上使用 PurePath 创建对象,该类的构造方法实际返回的是
PurePosixPath 对象;反之,如果在 Windows 系统上使用 PurePath 创建对象,该类的构造方法返回的是 PureWindowsPath 对象。

  考虑到操作系统的不同,Path 类的使用同 PurePath 类。

二、常用方法及属性

2.1 Path类方法

  介绍Path实例化用处

from pathlib import Path

shark = Path(Path.home(), "ocean", "animals", Path("fish", "shark.txt"))
print(shark)

输出结果如下:

/Users/sammy/ocean/animals/fish/shark.txt

  可用于拼接目录,且可字符串和Path实例混用,中间会自动加入对应系统的分隔符。下面方法主要是操作Path(“test_dir”)中的test_dir目录或文件

2.1.1 resolve()与absolute(): 获取绝对路径

from pathlib import Path

a = Path('..\\', 'test.txt')
print(a)
print(a.resolve())  # 将路径绝对化,解析任何符号链接。返回新的路径对象
print(a.absolute())  # 改为绝对路径,不会执行正规化或解析符号链接。 返回一个新的路径对象

  输出结果如下:

. 
C:\AutoTest_git\Python_Lib\Pathlib 
..\test.txt # 第一行为相对目录
C:\Users\Ju_Long\Desktop\test.txt # 第二行解析"..\"并输出绝对目录
C:\Users\Ju_Long\Desktop\Python\..\test.txt # 第三行没有解析"..\"只是做简单的拼接

2.1.2 stat(): 获得文件属性

import stat
from pathlib import Path

a = Path()
print(a.stat()[stat.ST_MODE])

  输出结果如下:

16895

  其中ST_MODE为操作系统中的定义

2.1.3 chmod(): 修改文件权限和时间戳

import stat
from pathlib import Path

a = Path()
print(a.stat()[stat.ST_MODE])
print(a.chmod(0o777))  # 第一种写法
print(a.chmod(stat.S_IWUSR | stat.S_IWGRP | stat.S_IWOTH))  # 第二种写法

  输出结果如下:

16895
None

2.1.4 mkdir(): 创建目录

from pathlib import Path

a = Path('test_dir')
a.mkdir() # 此处在当前目录创建了一个 test_dir文件夹

# 创建多级目录,如果`parent_directory`不存在,设置`parents=True`将会先创建`parent_directory`,然后再创建`child_directory`
path = Path('parent_directory/child_directory')
path.mkdir(parents=True)

2.1.5 rename(): 文件或文件夹重命名,如果路径不同,会移动并重新命名。

from pathlib import Path

# 将'test_dir'更名为'test_dir1'
a = Path('test_dir')
a.rename('test_dir1')

2.1.6 replace(): 文件或文件夹重命名,如果路径不同,会移动并重新命名,如果存在,则破坏现有目标。

from pathlib import Path

# 将'test_dir'更名为'test_dir1'
a = Path('test_dir1')
a.replace('test_dir2')

2.1.7 rmdir(): 删除目录

from pathlib import Path

# 被删除的文件夹test_dir5必须为空
a = Path('test_dir5')
a.rmdir()

2.1.8 unlink(): 删除一个文件

from pathlib import Path

# 只能删除文件,如果要删除目录,请用rmdir()
a = Path('markdown_test.md')
a.unlink(missing_ok=True) # 如果文件不存在时,会报FileNotFoundError。但当missing_ok=True时,会忽略此报错,相当于rm -f命令
# 注: missing_ok参数只有在Python 3.8版本以上才有

2.1.9 cwd(): 获得当前工作目录

from pathlib import Path

a = Path('markdown_test.md')
print(a.cwd())

  输出结果如下:

C:\AutoTest_git\Python_Lib\Pathlib

2.1.10 exists(): 判断是否存在文件或目录name

from pathlib import Path

print(Path('.').exists()) # 输出True
print(Path('setup.py').exists()) # 输出False

2.1.11 home(): 返回电脑的用户目录

from pathlib import Path

print(Path().home()) # 输出 C:\Users\Ju_Long

2.1.12 is_dir(): 检验给出的路径是一个文件

from pathlib import Path

print(Path('.').is_dir()) # 输出 True

2.1.13 is_file(): 检验给出的路径是一个目录

from pathlib import Path

print(Path('.').is_file()) # 输出 False

2.1.14 is_symlink(): 检验给出的路径是一个符号链接

from pathlib import Path

print(Path('Shortcut').is_symlink()) # 输出 False 暂时还没弄明白,在windows中不是快捷方式,在Linux中为软/硬连接

2.1.15 is_absolute(): 判断是否为绝对路径

from pathlib import Path

print(Path('.').is_absolute()) # 输出 False

2.1.16 joinpath(): 连接目录与文件名或目录

from pathlib import Path

# 拼接目录这样写,必须实例化后紧跟joinpath()方法, 并且只有第一个需要加'/'作为根目录标识,其他的以字符串作为拼接
print(Path('C:', '/long').joinpath('windows','a','b'))  # 输出结果为 C:\long\windows\a\b

# 像这种先实例化赋值后再调用joinpath()方法的, 无法成功
a = Path('C:/qulong').joinpath('windows','a','b')
print(a.joinpath('windows')) # 输出为 C:\qulong\windows\a\b\windows 此方法无法改变原有的实例a, 故下方输出的仍然是a原有的路径
print(a) # 输出为 C:\qulong\windows\a\b

# 根目录'/'标识符只能使用一次,第二次会将第一次的覆盖
print(Path('c:/windows').joinpath('/Program Files')) # 输出结果为 c:\Program Files

2.1.17 samefile(): 判断两个路径是否相同

from pathlib import Path

# 判断相同的文件名
a = Path(r'C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.py')
print(a.samefile(r'C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.py'))  # 输出为 True

# 判断文件名时,必须是路径和文件名都相同才会判定为 Ture。下面路径不同,文件名相同仍然为 False
b = Path(r'C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.py')
print(b.samefile(r'C:\Temp\Pathlib\Pathlib.py'))  # 输出为 False

# 判断相同路径
c = Path(r'C:\AutoTest_git\Python_Lib\Pathlib')
print(c.samefile(r'C:\AutoTest_git\Python_Lib\Pathlib'))  # 输出为 True

# 不同路径,同名文件夹仍然为 False
d = Path(r'C:\AutoTest_git\Python_Lib\Pathlib')
print(d.samefile(r'C:\Temp\Pathlib'))  # 输出为 False

2.2 Path类属性

2.2.1 name返回文件名(或文件夹名)、parent返回文件路径、suffix分离文件名和扩展名、

from pathlib import Path

a = Path(r'C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.py')
print(a.name)  # 输出Pathlib.py
print(a.parent)  # 输出C:\AutoTest_git\Python_Lib\Pathlib 上级目录
print(a.parent.parent)  # 输出C:\AutoTest_git\Python_Lib 上上级目录,可以叠加使用
print(a.suffix)  # 输出文件后缀.py
print(a.stem)  # 返回文件名Pathlib

2.2.2 suffixes返回多个后缀、root返回根目录、parts返回路径组成部分、anchor返回盘符

from pathlib import Path

a = Path(r'C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.py.zip')
print(a.suffixes)  # 文件可以有多个后缀,返回一个列表['.py', '.zip']
print(a.root)  # 返回根目录'\'
print(a.parts)  # 返回文件路径各个组成部分('C:\\', 'AutoTest_git', 'Python_Lib', 'Pathlib', 'Pathlib.py.zip')与Path().joinpath()反着用
print(a.anchor)  # 返回'C:\' 与root的区别是会返回盘符

2.2.3 parents输出每一级目录(返回一个生成器)

from pathlib import Path

a = Path(r'C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.py.zip')
for i in a.parents:
    print(i) # 输出每一级目录

  输出如下:

C:\AutoTest_git\Python_Lib\Pathlib
C:\AutoTest_git\Python_Lib
C:\AutoTest_git
C:\

2.3 Path路径匹配查找

2.3.1 iterdir()查找文件夹下的所有文件(返回一个生成器)

from pathlib import Path

a = Path(r'C:\AutoTest_git\Python_Lib\Pathlib')  # 此处必须为路径不能带有文件
print(a.iterdir())
for i in a.iterdir():
    print(i)

  输出如下:

<generator object Path.iterdir at 0x00000173C3869510>
C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.md
C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.py
C:\AutoTest_git\Python_Lib\Pathlib\test_dir

2.3.2 glob()查找文件夹下所有与 pattern 匹配的文件(返回一个生成器)

from pathlib import Path

a = Path(r'C:\AutoTest_git\Python_Lib\Pathlib')
print(a.glob(f'*.*'))
for i in a.glob(f'*.*'):
    print(i)

  输出如下

<generator object Path.glob at 0x000001620D769510>
C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.md
C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.py
	注:其中有一个写法 -- a.glob(f'**\*.*')中的**\加上去后与a.rglob(f'*.*')函数的用法相同,尽量减少这么用,可读性较差

2.3.3 rglob()查找文件夹下所有子文件夹中与 pattern 匹配的文件(返回一个生成器)

from pathlib import Path

a = Path(r'C:\AutoTest_git\Python_Lib\Pathlib')
print(a.rglob(f'*.*'))
for i in a.rglob(f'*.*'):
    print(i)
print('查找.py文件')
for i in a.rglob(f'*.py'):
    print(i)

 输出如下:

<generator object Path.rglob at 0x0000022B3D0615F0>
C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.md
C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.py
C:\AutoTest_git\Python_Lib\Pathlib\test_dir\test.csv
C:\AutoTest_git\Python_Lib\Pathlib\test_dir\test.py
查找.py文件
C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.py
C:\AutoTest_git\Python_Lib\Pathlib\test_dir\test.py

2.4 Path文件读写操作

  个人觉得不是很方便不推荐使用

2.5 Path操作实例

2.5.1 输出目录树

from pathlib import *


def dir_tree(path: [str, Path], level=0):
    if Path(path).exists() and Path(path).is_dir():
        for file_dir in Path(path).iterdir():
            if Path(file_dir).is_dir():
                print('|  ' * level + '|--' + Path(file_dir).name)
                dir_tree(file_dir, level + 1)
            elif Path(file_dir).is_file():
                print('|  ' * level + '|--' + Path(file_dir).name)
    else:
        print(f'The path does not exist or it isn\'t a directory')

dir_tree(f"C:\AutoTest_git")

  输出如下:

|--Python_Lib
|  |--Pathlib
|  |  |--Pathlib.md
|  |  |--Pathlib.py
|  |  |--test_dir
|  |  |  |--test.csv
|  |  |  |--test.py
|  |  |  |--test.txt

2.5.2 查找符合条件的文件

def filter_file_list(path, suffix_list: [list, None] = None, sub_dir: bool = False):
    """
    path:输入路径,支持文件路径和文件夹路径
    sub_dir:当为True时含子目录,为False时不含子目录
    suffix_list:文件类型列表,按要求的列出全部符合条件的文件,为空时列出全部文件,如:[".xlsx",".xls"]
    """
    if suffix_list is None:
        suffix_list = ['.*']
    else:
        suffix_list = list(set(suffix_list))  # 去除重复的后缀
    file_list = []

    if Path(path).exists():
        # 目标为文件夹
        if Path(path).is_dir():
            if sub_dir:
                for i in suffix_list:
                    [file_list.append(str(f)) for f in Path(path).rglob(f"*{i}") if Path(f).is_file()]
            else:
                for i in suffix_list:
                    [file_list.append(str(f)) for f in Path(path).glob(f"*{i}") if Path(f).is_file()]
        elif Path(path).is_file():
            file_list = [path]

        # 去除临时文件
        file_list_temp = []
        for y in file_list:
            if "~$" in Path(y).stem:
                continue
            file_list_temp.append(y)
        file_list = file_list_temp
        return file_list
    else:
        print("输入有误!")
        return []


print(filter_file_list(f"C:\AutoTest_git\Python_Lib\Pathlib", sub_dir=True, suffix_list=['.py', '.csv']))

参考文章:

  1. 如何使用pathlib模块在Python3中操作文件系统路径
  2. Python路径操作模块pathlib,看这篇就够了!
  3. pathlib — Object-oriented filesystem paths
  • 18
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值