.
模块中类关系
pathlib中的路劲类分为纯路劲'PurePath'(代表PurePath类的家族类(PurePath,PurePosixPath,PureWindowsPath)),和具体路劲(Path,PoisxPath,WindowsPath)。其中具体路劲继承自纯路劲。
纯路径对象提供的路径处理操作实际上并不访问文件系统。如果你只想处理路劲,而不实际访问操作系统,实例化一个纯路劲类来处理可能很有用。这就可以在Unix系统中操作Windows路劲(反之亦然)。
PurePath
pathlib.PurePath(*pathsegments),其中pathsegments的每个元素可以是表示路径段的字符串,继承os.PathLike这个抽象类并实现了__fspath__抽象函数,这个抽象函数返回一个路劲字符串或另一个路径对象(本质上这个路劲对象也是实现了os.PathLike这个接口)。当pathsegments为空,默认代表当前目录。推荐使用PurePath('/etc','usr'),这相当于os.path.join('/etc','usr')。注意,在Windows下,试图更改本地根目录并不会更改成功,还是会按照驱动器设置。如下所示:
路劲类也会自动的进行.和//的折叠,注意PurePath("foo/../bar")和PurePath("bar")只有当foo不是一个符号链接,才等效
PurePosixPath和PureWindowsPath
PurePosixPath路劲类表示非Windows下文件系统路劲,而PureWindowsPath表示Windows下文件路劲,无论你在哪个系统上运行,都可以实例化所有这些类,因为它们不提供任何进行系统调用的操作。
这些路劲类是不可变的和可哈希的,它们可以比较大小,其中相同的flavor(代指这些类),即PurePosixPath之间比较大小,会区分路劲的大小写,而PureWindowsPath比较大小,则不会区分(内部实际上都是把他们转为了小写)
注意:这些路劲的字符串表示形式是原始文件系统路劲本身
使用PurePath.parts属性会返回一个元组,里面包括由每个最小路劲段组成的元组
使用PurePath.drive属性返回驱动器名称,没有返回''
使用PurePath.root属性返回表示根的字符串(文件系统分隔符)
使用PurePath.anchor属性 drive+root
使用PurePath.parents属性返回一个对象,这个对象可以通过迭代和索引获得PurePath对象,这个对象的路劲字符串是它的逻辑祖先的绝对路径
使用PurePath.parent属性返回PurePath对象,这个对象的路劲字符串是它的逻辑父目录的绝对路径,这是一个纯粹的词汇操作,p = PurePosixPath("foo/.."),p.parent返回的是PurePosixPath("foo")。如果要向上遍历任何文件系统路劲,建议使用resolve()消除符号链接和.
使用PurePath.name属性返回最后路劲基本段的字符串,这个段不包括drive属性
使用PurePath.suffix属性返回以.开头的后缀名,没有则返回''
使用PurePath.suffixes属性返回一个列表,这个列表包括所有的后缀名
使用PurePath.stem返回路劲的最后基本段,这个基本段不包含后缀名
使用PurePath.as_posix(),返回这个对象保存的文件路劲字符串,但是这个字符串的路劲分隔符全使用"/"
使用PurePath.is_absolute(),这个路劲对象要包含驱动器名称(Windows下)或根(unix下),包含返回True,否则返回False
使用PurePath.is_reserved(),在Windows下有路劲被认为是保留的,如果这个路劲被认为是保留路劲,则返回True,否则返回False。在Unix下始终返回False。如果路劲被认为是保留的,不建议对其进行操作,可能会神秘失败或产生意外影响
使用PurePath.joinPath(*others),相当于os.path.joinpath
使用PurePath.match(pattern),pattern是glob风格类型的匹配,如果pattern是相对的,从右边开始匹配,如果pattern是绝对的,遵循绝对匹配,遵循平台的默认大小写规则。
使用PurePath.relative_to(*other),返回一个PurePath对象,这个对象的路劲字符串是调用者相对于other路劲的相对路劲,个人感觉没啥用
使用PurePath.with_name(name),name替换old_name,如果该对象路劲字符串name='',则抛ValueError异常,替换后的是一个新对象
使用PurePath.with_suffix(suffix),替换的是一个suffix,和with_name()差不多
Path
具体路劲类是纯路劲类的子类,它们除了具有纯路劲类的所有功能,还可以进行系统调用。
实例化Path,它会根据flavour创建PosixPath或者WindowsPath
你只能实例化与您的系统相对应的类风格,对不兼容的路劲风格进行系统调用可能会导致应用程序中出现错误
除了上述说到的纯路劲提供的属性和方法外,具体路劲类还提供以下方法:
使用Path.cwd(),返回当前工作目录的Path对象
使用Path.home(),返回用户家目录的Path对象
使用Path.stat(),返回一个os.stat_result对象,这个对象包含此路径文件的信息
使用Path.chmod(mode),改变文件读写执行权限
使用Path.exists(),路劲是否指向文件系统上的现有文件或目录,如果这个路劲是一个符号链接,exists()返回符号链接是否指向现有文件或目录
使用Path.expanduser(),返回一个新对象,这个新对象会将原有的路劲字符串的~替换为当前用户的绝对路径
使用Path.glob(pattern),pattern为**,表示此目录和所有子目录,返回一个生成器,这个生成器中全是Path对象
使用Path.group(),返回这个文件的所属组id,仅在unix系统中支持,如果在系统数据库中没有找到,则会抛出KeyError
使用Path.is_dir(),如果它指向一个目录,则返回True,反之,返回False,当文件路劲字符串或者符号链接不存在,也会返回False,权限不够会有错误
使用Path.is_file(),如果它指向一个普通文件,则返回False,当文件路劲字符串或者符号链接不存在,也会返回False,权限不够会有错误
使用Path.is_mount(),当前文件路劲是否被挂载,只在unix上被实现,windows下没有实现
使用Path.is_symlink(),如果路劲指向符号链接,则返回True,否则返回False,当文件路劲字符串不存在,也会返回False,权限不够会有错误
使用Path.iterdir(),返回一个生成器,里面全是Path对象,这些对象的文件路劲字符串是当前目录的所有文件和目录
使用Path.lchmod(mode),如果是符号链接,改变符号链接的属性,而不是其指向的文件的属性
使用Path.mkdir(mode=0o777, parents=False, exist_ok=False),如果parents为True,则创建此目录缺少的所有的父级,相当于mkdir -p。如果exist_ok为False,如果目标目录已经存在则抛异常。如果其为True,当文件路劲名和存在的文件名相同时,仍会抛出异常
使用Path.open(),和open()类似
使用Path.read_bytes(),读取二进制数据
使用Path.read_text(),读取文本数据
使用Path.rename(target),target既可以是个字符串也可以是个Path对象,推荐这样使用:
使用Path.replace(target),将文件或目录重命名为target,如果文件或目录存在,也会无条件替换
使用Path.resolve(strict=False),解析任何符号链接,把所有文件变为绝对路劲,返回一个新的Path对象,如果文件路劲不存在并且strict为True,会抛出FileNotFoundError。如果strict为False,尽可能解析路劲,如果在解析过程中出现无限循环,会抛出RuntimeError异常
使用Path.rglob(pattern),等价于Path.glob("**/")
使用Path.rmdir(),删除一个空目录
使用Path.samefile(other_path),这个other_path是一个Path对象或者一个字符串,感觉在==号的基础上方便了字符串比较
使用Path.symlink_to(target, target_is_directory=False),使Path对象里的文件路劲成为指向xxx的符号链接,在Windows下,如果链接的目标是目录,则target_is_directory必须为True,Unix下忽略这个参数
使用Path.touch(mode=0o666, exist_ok=True),根据Path对象指定的路劲创建一个文件,如果exist_ok=True,并且文件存在,会更新它的修改时间
使用Path.unlink(),移除这个文件或者符号链接,如果是目录,使用Path.rmdir()代替
使用Path.write_bytes(data),打开文件,写字节,关闭
使用Path.write_text(data, encoding=None, errors=None)打开文件,写字符,关闭
综述
以上是我对pathlib的总结,几乎涵盖了pathlib的所有用法, 写这个的原因是因为百度上关于pathlib的使用讲解的太过潦草。所以,本人于2022年1月2日写此博客。如要转载,请标明转载地址和作者。
作者:翔宇哥