pathlib详解

.

模块中类关系

    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日写此博客。如要转载,请标明转载地址和作者。

                                                                                  作者:翔宇哥




©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容