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)
pathlib_operator.py

 运行效果

<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())
pathlib_resolve.py

 运行效果

/usr/share

 3、利用列表元素拼接路径

import pathlib

root = pathlib.PurePosixPath('/')
subdir_list = ['usr', 'local']
usr_local = root.joinpath(*subdir_list)
print(usr_local)
pathlib_joinpath.py

 运行效果

/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)
pathlib_from_existing.py

  运行效果

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)
pathlib_parts.py

运行效果

('/', '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)
pathlib_parents.py

运行效果

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))  # 文件名称(不包含扩展名)
pathlib_name.py

 运行效果

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)
pathlib_convenience.py

 运行效果

家目录路径 C:\Users\Administrator
获取当前目录路径 D:\Program Files\JetBrains\Test

 9、迭代打印出当前目录下的所有文件名

import pathlib

p = pathlib.Path('.')

for f in p.iterdir():
    print(f)
pathlib_iterdir.py

运行效果

.idea
parser_xls
pathlib_iterdir.py
todb.db
__pycache__

 10、通过定义正则表达式,实现文件名的过滤

import pathlib

p = pathlib.Path('.')

for f in p.glob('*.py'):
    print(f)
pathlib_glob.py
server.py
test.py
pathlib_glob.py

 11、通过定义正则表达式,递归的方式实现文件名的过滤

import pathlib

p = pathlib.Path('.')

for f in p.rglob('t*.py'):
    print(f)
pathlib_rglob.py

运行效果

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')))
pathlib_read_write.py

 运行效果

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()
pathlib_mkdir.py

运行效果

目录不存在的时候,创建
创建目录: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)
pathlib_symlink_to.py

 运行效果

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(),
    ))
pathlib_types.py

运行效果

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))
pathlib_stat.py

 运行效果

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()))
pathlib_ownership.py

运行效果

[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))
pathlib_touch.py

运行效果

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))
pathlib_chmod.py

 运行效果

[root@python-mysql ~]# python3 pathlib_chmod.py
没有修改前: 644
增加可执行权限
修改后的权限 : 744

 20、删除空目录

import pathlib

p = pathlib.Path('example_dir')
print('Removing {}'.format(p))
p.rmdir()
pathlib_rmdir.py
 需要注意的是,目录里面必须是清空,不然会报异常
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())
pathlib_unlink.py

 

 运行效果

exists before removing: True
exists after removing: False

 

posted @ 2020-04-25 14:58  小粉优化大师  阅读(443)  评论(0编辑  收藏  举报