(转)pathlib路径库使用详解
原文:https://xin053.github.io/2016/07/03/pathlib%E8%B7%AF%E5%BE%84%E5%BA%93%E4%BD%BF%E7%94%A8%E8%AF%A6%E8%A7%A3/
pathlib简介
pathlib库在python 3.4以后已经成为标准库,基本上可以代替os.path
来处理路径。它采用完全面对对象的编程方式。
总共有6个类用来处理路径,大体可以分为两类:
- pure paths 单纯的路径计算操作而没有IO功能
- concrete paths 路经计算操作和IO功能
这6个类的继承关系如下:
可以看到PurePath
是所有类的基类,我们重点要掌握PurePath
和Path
这两个类,在Windows平台下路径对象会有Windows前缀,Unix平台上路径对象会有Posix前缀。
基本使用
列出所有子目录
1
2
3
4
5
6
7
|
>>> import pathlib
>>> p = pathlib.Path('.')
>>> [x for x in p.iterdir() if x.is_dir()]
[WindowsPath('.git'), WindowsPath('.idea'), WindowsPath('.vscode'),
WindowsPath('1_函数参数'), WindowsPath('2_生成器'), WindowsPath('3_常用函数'),
WindowsPath('4_装饰器), WindowsPath('5_常用模块')]
# 在linux环境下,上述的WindowsPath都会变为PosixPath
|
列出指定类型的文件
1
|
list(p.glob('**/*.py'))
|
路径拼接
可以使用/
符号来拼接路径
1
2
3
4
|
>>> p = pathlib.Path(r'F:\cookies\python')
>>> q = p / 'learnPython'
>>> print(q)
F:\cookies\python\learnPython
|
查询属性
1
2
3
4
|
>>> q.exists()
True
>>> q.is_dir()
True
|
打开文件
1
2
3
4
|
>>> q = q / "hello_world.py"
>>> with q.open() as f:
>>> print(f.readline())
#!/usr/bin/env python
|
Pure paths
产生Pure paths的三种方式
class pathlib.PurePath(*pathsegments)
1
2
3
|
>>> PurePath('setup.py')
PurePosixPath('setup.py') # Running on a Unix machine
PureWindowsPath('setup.py') # Running on a Windows machine
|
1
2
3
4
|
>>> PurePath('foo', 'some/path', 'bar')
PureWindowsPath('foo/some/path/bar')
>>> PurePath(Path('foo'), Path('bar'))
PureWindowsPath('foo/bar')
|
如果参数为空,则默认指定当前文件夹
1
2
|
>>> PurePath()
PureWindowsPath('.')
|
当同时指定多个绝对路径,则使用最后一个
1
2
|
>>> PureWindowsPath('c:/Windows', 'd:bar')
PureWindowsPath('d:bar')
|
在Windows平台上,参数路径上如果有\
或者/
,则使用之前设置的盘符
1
2
|
>>> PureWindowsPath('F:\cookies\python\learnPython','\game')
PureWindowsPath('F:/game')
|
class pathlib.PurePosixPath(*pathsegments)
1
2
|
>>> PurePosixPath('/etc')
PurePosixPath('/etc')
|
class pathlib.PureWindowsPath(*pathsegments)
1
2
|
>>> PureWindowsPath('c:/Program Files/')
PureWindowsPath('c:/Program Files')
|
Path计算
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
>>> 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: unorderable types: PureWindowsPath() < PurePosixPath()
|
str() 和 bytes()
1
2
3
4
5
6
7
8
|
>>> p = PurePath('/etc')
>>> str(p)
'/etc'
>>> p = PureWindowsPath('c:/Program Files')
>>> str(p)
'c:\\Program Files'
>>> bytes(p)
b'/etc'
|
常用属性和方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
>>> PureWindowsPath('c:/Program Files/').drive
'c:'
>>> PurePosixPath('/etc').root
'/'
>>> 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:/')
>>> PureWindowsPath('//some/share/setup.py').name
'setup.py'
>>> PureWindowsPath('//some/share').name
''
>>> PurePosixPath('my/library/setup.py').suffix
'.py'
>>> PurePosixPath('my/library.tar.gz').suffix
'.gz'
>>> PurePosixPath('my/library').suffix
''
>>> PurePosixPath('my/library.tar.gar').suffixes
['.tar', '.gar']
>>> PurePosixPath('my/library.tar.gz').suffixes
['.tar', '.gz']
>>> PurePosixPath('my/library').suffixes
[]
>>> PurePosixPath('my/library.tar.gz').stem
'library.tar'
>>> PurePosixPath('my/library.tar').stem
'library'
>>> PurePosixPath('my/library').stem
'library'
>>> p = PureWindowsPath('c:\\windows')
>>> str(p)
'c:\\windows'
>>> p.as_posix()
'c:/windows'
>>> p = PurePosixPath('/etc/passwd')
>>> p.as_uri()
'file:///etc/passwd'
>>> p = PureWindowsPath('c:/Windows')
>>> p.as_uri()
'file:///c:/Windows'
>>> 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
>>> 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 "<stdin>", line 1, in <module>
File "pathlib.py", line 694, in relative_to
.format(str(self), str(formatted)))
ValueError: '/etc/passwd' does not start with '/usr'
>>> 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
>>> 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')
|
Concrete paths
产生Concrete paths的三种方式
class pathlib.Path(*pathsegments)
1
2
3
|
>>> Path('setup.py')
PosixPath('setup.py') # Running on a Unix machine
WindowsPath('setup.py') # Running on a Windows machine
|
class pathlib.PosixPath(*pathsegments)
1
2
|
>>> PosixPath('/etc')
PosixPath('/etc')
|
class pathlib.WindowsPath(*pathsegments)
1
2
|
>>> WindowsPath('c:/Program Files/')
WindowsPath('c:/Program Files')
|
常用方法
cwd()
设置path对象为当前路径
1
2
|
>>> Path.cwd()
WindowsPath('D:/Python 3.5')
|
stat()
获取文件或目录属性
1
2
3
|
>>> p = Path('setup.py')
>>> p.stat().st_size
956
|
chmod()
Unix系统修改文件或目录权限
exists()
判断文件或目录是否存在
1
2
3
4
5
6
7
8
9
|
>>> from pathlib import *
>>> Path('.').exists()
True
>>> Path('setup.py').exists()
True
>>> Path('/etc').exists()
True
>>> Path('nonexistentfile').exists()
False
|
glob()
列举文件
1
2
3
4
5
6
7
8
9
10
11
|
>>> 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')]
# The "**" pattern means "this directory and all subdirectories, recursively"
|
is_dir()
判断是否是目录
is_file()
判断是否是文件
is_symlink()
判断是否是链接文件
iterdir()
如果path指向一个目录,则返回该目录下所有内容的生成器
mkdir(mode=0o777, parents=False)
创建目录
open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)
打开文件
owner()
获取文件所有者
rename(target)
修改名称
1
2
3
4
5
6
7
|
>>> p = Path('foo')
>>> p.open('w').write('some text')
9
>>> target = Path('bar')
>>> p.rename(target)
>>> target.open().read()
'some text'
|
resolve()
Make the path absolute, resolving any symlinks. A new path object is returned
1
2
3
4
5
|
>>> p = Path()
>>> p
PosixPath('.')
>>> p.resolve()
PosixPath('/home/antoine/pathlib')
|
rmdir()
删除目录,目录必须为空
touch(mode=0o777, exist_ok=True)
创建空文件
(转)pathlib路径库使用详解的更多相关文章
- STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解)
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) 前面 ...
- Python爬虫之selenium库使用详解
Python爬虫之selenium库使用详解 本章内容如下: 什么是Selenium selenium基本使用 声明浏览器对象 访问页面 查找元素 多个元素查找 元素交互操作 交互动作 执行JavaS ...
- STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)
介绍 FwLib_STC8 是一个针对STC8G, STC8H系列MCU的C语言封装库, 适用于基于这些MCU的快速原型验证. 项目地址: Gitee FwLib_STC8 镜像地址: GitHub ...
- JNI_Android项目中调用.so动态库实现详解
转自:http://www.yxkfw.com/?p=7223 1. 在Eclipse中创建项目:TestJNI 2. 新创建一个class:TestJNI.java package com.wwj. ...
- JNI_Android项目中调用.so动态库实现详解【转】
转自 http://www.cnblogs.com/sevenyuan/p/4202759.html 1. 在Eclipse中创建项目:TestJNI 2. 新创建一个class:TestJNI.ja ...
- CREATE DATABASE建库语句详解
原创地址:http://blog.csdn.net/guguda2008/article/details/5716939 一个完整的建库语句是类似这样的: IF DB_ID('TEST') IS NO ...
- Linux 库文件详解
转自: http://www.cppblog.com/deane/articles/165216.html http://blog.sciencenet.cn/blog-1225851-904348. ...
- (笔记)Linux下的静态库和动态库使用详解
库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 一.静态库和动态库的区别 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比 ...
- 深入探讨Linux静态库与动态库的详解(转)
2.生成动态库并使用 linux下编译时通过 -shared 参数可以生成动态库(.so)文件,如下 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 一.静 ...
随机推荐
- Oracle数据库使用mybatis的时候,实体类日期为Date类型,mybatis里面定义的是Date类型,插入的时候,时分秒全部是12:00:00问题
实体类中日期定义的是Date类型的,没毛病: 我在mybatis里面定义的是Date类型的,进行测试的时候发现,数据库插入的日期的时分秒全部都是一样的,都是12:00:00,很郁闷: 后来把mybat ...
- 利用url传多个参数
刚开始接触jsp,比较偏向于用button标签的onclick方法进行页面的跳转.但是关于页面跳转的各种问题真是叫人头大,以下记录,仅仅为自己以后查看. Qone 用url传参的时候遇到中文怎么办 编 ...
- 1, 2, and 4 symbols per clock中数据排列
图片来自High-DenitionMultimedia Interface (HDMI) IP Core User Guide 在自己处理的过程中很多细节的东西必须要清楚. 今天想自己从RGB数据中 ...
- Codeforces Round#416 Div.2
A. Vladik and Courtesy 题面 At regular competition Vladik and Valera won a and b candies respectively. ...
- Android自定义视图一:扩展现有的视图,添加新的XML属性
这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...
- x11 VNC远程桌面
Ubuntu远程桌面,类似于qq远程桌面(Ubuntu没有内置桌面系统吗?) $ sudo apt-get update $ sudo apt-get install x11vnc $ x11vnc ...
- 认识Hadoop
概述 开源.分布式存储.分布式计算 大数据生态体系 特点:开源.社区活跃 囊括了大数据处理的方方面面 成熟的生态圈 推荐系统 应用场景 搭建大型数据仓库,PB级数据的存储.处理.分析.统计 日志分析 ...
- nodeclub route
这里是把web_router.js放在根目录下,也可以放在routes文件件下,其实都可以. 这里就是一些url与controller和middleware对应
- ASP.NET Web API 框架研究 Controller创建 HttpController 类型解析 选择 创建
上一篇介绍了HttpController的一些细节,接下来说下HttpController 类型解析.选择和创建.生产HttpController实例的生产线如下图: 一.涉及的类及源码分析 涉及的类 ...
- [mysqli_escape]mysql转义两次
// mysqli_real_escape_string // 第一次转义的结果 SELECT * FROM example WHERE f_email='example@exampl.com' an ...