Python之pathlib模块的使用
pathlib模块的作用
提供了一个面向对象的API来解析、建立、测试和处理文件名和路径,而不是使用底层字符串操作。
1、构建路径
import pathlib # 构建/usr路径 usr = pathlib.PurePosixPath('/usr') print(type(usr), usr) # 路径的拼接方式一 usr_local = usr / 'local' print(type(usr_local), usr_local) # 路径的拼接方式二 usr_share = usr / pathlib.PurePosixPath('share') print(type(usr_share), usr_share) # 使用路径符号,返回上级目录 root = usr / '..' print(type(root), root) # 测试返回上级目录是否生效和配置根目录显示的用方 etc = root / '/etc/' print(type(etc), etc)
运行效果
<class 'pathlib.PurePosixPath'> /usr <class 'pathlib.PurePosixPath'> /usr/local <class 'pathlib.PurePosixPath'> /usr/share <class 'pathlib.PurePosixPath'> /usr/.. <class 'pathlib.PurePosixPath'> /etc
2、类路径的解析,可以通过目录和符号链接的文件系统并生成名称引用的绝对路径来规范路径。
import pathlib usr_local = pathlib.Path('/usr/local') share = usr_local / '..' / 'share' print(share.resolve())
运行效果
/usr/share
3、利用列表元素拼接路径
import pathlib root = pathlib.PurePosixPath('/') subdir_list = ['usr', 'local'] usr_local = root.joinpath(*subdir_list) print(usr_local)
运行效果
/usr/local
4、with_name():拼接路径,with_suffix():修 改路径后缀扩展名
import pathlib # 构建路径 ind = pathlib.PurePosixPath('source/pathlib/index.rst') print(ind) # 在构建路径增加多一个文件名 py = ind.with_name('pathlib_from_existing.py') print(py) # 将构建好的路径,修改后缀扩展名 pyc = py.with_suffix('.pyc') print(pyc)
运行效果
source/pathlib/index.rst source/pathlib/pathlib_from_existing.py source/pathlib/pathlib_from_existing.pyc
5、解析路径
import pathlib pathlib_obj = pathlib.PurePosixPath('/usr/local') print(pathlib_obj.parts)
运行效果
('/', 'usr', 'local')
6、通过pathlib模块打印出路径的继承关系
import pathlib pathlib_obj = pathlib.PurePosixPath('/usr/local/lib') print('parent: {}'.format(pathlib_obj)) print('打印路径继承关系') for up in pathlib_obj.parents: print(up)
运行效果
parent: /usr/local/lib 打印路径继承关系 /usr/local /usr /
7、获取自定义路径的属性值,包含文件名,扩展名等参数
import pathlib p = pathlib.PurePosixPath('./source/pathlib/pathlib_name.py') print('path : {}'.format(p)) # 打印定义的完整目录 print('name : {}'.format(p.name)) # 完整的文件名 print('suffix: {}'.format(p.suffix)) # 后缀 print('stem : {}'.format(p.stem)) # 文件名称(不包含扩展名)
运行效果
path : source/pathlib/pathlib_name.py
name : pathlib_name.py
suffix: .py
stem : pathlib_name
8、获取常量的目录路径
import pathlib home = pathlib.Path.home() print('家目录路径', home) cwd = pathlib.Path.cwd() print('获取当前目录路径', cwd)
运行效果
家目录路径 C:\Users\Administrator
获取当前目录路径 D:\Program Files\JetBrains\Test
9、迭代打印出当前目录下的所有文件名
import pathlib p = pathlib.Path('.') for f in p.iterdir(): print(f)
运行效果
.idea parser_xls pathlib_iterdir.py todb.db __pycache__
10、通过定义正则表达式,实现文件名的过滤
import pathlib p = pathlib.Path('.') for f in p.glob('*.py'): print(f)
server.py
test.py
pathlib_glob.py
11、通过定义正则表达式,递归的方式实现文件名的过滤
import pathlib p = pathlib.Path('.') for f in p.rglob('t*.py'): print(f)
运行效果
test.py
12、读写文件
import pathlib file_obj = pathlib.Path('example.txt') # 写入内容到本地文件上 file_obj.write_bytes('This is the Content'.encode('utf-8')) # 打开文件读取内容 with file_obj.open('r', encoding='utf-8') as handle: print('read from open(): {!r}'.format(handle.read())) # 直接通过Path对象读取文件内容 print('read_text(): {!r}'.format(file_obj.read_text('utf-8')))
运行效果
read from open(): 'This is the Content' read_text(): 'This is the Content'
13、目录的创建
import pathlib p = pathlib.Path('example_dir') print('创建目录:{}'.format(p)) p.mkdir()
运行效果
目录不存在的时候,创建 创建目录:example_dir 目录存的时候,报异常 FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: 'example_dir'
14、创建软链接
import pathlib p = pathlib.Path('example_dir') p.symlink_to('index.rst') print(p) print(p.resolve().name)
运行效果
example_dir
index.rst
15、判断文件的类型
import itertools import pathlib root = pathlib.Path('test_files') # 判断目录是否存在 if root.exists(): for f in root.iterdir(): # 删除文件或软连接 f.unlink() else: root.mkdir() # 创建测试文件 (root / 'file').write_text('This is a gregular file', encoding='utf-8') (root / 'symlink').symlink_to('file') # 创建file软链接,链接名字file # 检查文件类型的功能 # 这里的作用,就是迭代器扩展其它元素 to_scan = itertools.chain( root.iterdir(), [pathlib.Path('/dev/disk0'), pathlib.Path('/dev/console')] ) hfmt = '{:18s}' + (' {:>5}' * 6) print(hfmt.format('Name', 'File', 'Dir', 'Link', 'FIFO', 'Block', 'Character')) fmt = '{:20s}' + (' {:>5}' * 6) for f in to_scan: print(fmt.format( str(f), f.is_file(), f.is_dir(), f.is_symlink(), f.is_fifo(), f.is_block_device(), f.is_char_device(), ))
运行效果
Name File Dir Link FIFO Block Character test_files\file 1 0 0 0 0 0 test_files\symlink 1 0 1 0 0 0 \dev\disk0 0 0 0 0 0 0 \dev\console 0 0 0 0 0 0
16、获取文件属性
import pathlib import sys # 当命令行没有传入参,则取当前代码文件名路径 import time if len(sys.argv) == 1: file_name = __file__ else: file_name = sys.argv[1] p = pathlib.Path(file_name) stat_info = p.stat() print('{}:'.format(file_name)) print(' Size:', stat_info.st_size) print(' Permissions:', oct(stat_info.st_mode)) print(' Owner:', oct(stat_info.st_uid)) print(' Device:', oct(stat_info.st_dev)) print(' Create:', time.ctime(stat_info.st_ctime)) print(' Last Modified Time:', time.ctime(stat_info.st_mtime)) print(' Last Accessed Time:', time.ctime(stat_info.st_atime))
运行效果
D:/Program Files/test.py: Size: 634 Permissions: 0o100666 Owner: 0o0 Device: 0o12355654761 Create: Wed Jan 15 17:38:00 2020 Last Modified Time: Sat Apr 25 11:15:41 2020 Last Accessed Time: Sat Apr 25 11:15:41 2020 Process finished with exit code 0
17、获取文件权限所属用户
import pathlib p = pathlib.Path(__file__) print('{} is owned by {}|{}'.format(p, p.owner(), p.group()))
运行效果
[root@localhost ~]# python3 pathlib_ownership.py test.py is owned by root|root
18、创建文件和修改或更新文件的时间
import pathlib import time p = pathlib.Path('touched') if p.exists(): print('touched文件已存在。') else: print('touched创建成功。') p.touch() start = p.stat() time.sleep(1) p.touch() end = p.stat() print('开始:', time.ctime(start.st_mtime)) print('结束:', time.ctime(end.st_mtime))
运行效果
touched创建成功。 开始: Sat Apr 25 11:24:36 2020 结束: Sat Apr 25 11:24:37 2020
19、修改文件权限
import os import pathlib import stat f = pathlib.Path('chmod_example.txt') if f.exists(): f.unlink() f.write_text('contents') # 获取权限值 existing_permissions = stat.S_IMODE(f.stat().st_mode) print('没有修改前: {:o}'.format(existing_permissions)) if not (existing_permissions & os.X_OK): print('增加可执行权限') # stat.S_IXUSR : 用户执行权限 new_permissions = existing_permissions | stat.S_IXUSR else: print('移动可执行权限') new_permissions = existing_permissions ^ stat.S_IXUSR f.chmod(new_permissions) after_permissions = stat.S_IMODE(f.stat().st_mode) print('修改后的权限 : {:o}'.format(after_permissions))
运行效果
[root@python-mysql ~]# python3 pathlib_chmod.py 没有修改前: 644 增加可执行权限 修改后的权限 : 744
20、删除空目录
import pathlib p = pathlib.Path('example_dir') print('Removing {}'.format(p)) p.rmdir()
需要注意的是,目录里面必须是清空,不然会报异常 OSError: [WinError 145] 目录不是空的。: 'example_dir'
21、删除指定的文件或连接文件
import pathlib p = pathlib.Path('touched') p.touch() print('exists before removing:', p.exists()) p.unlink() print('exists after removing:', p.exists())
运行效果
exists before removing: True
exists after removing: False