pathlib 库

pathlib 库

使用os.path是常用的python路径操作方法,但pathlib库更加方便,它实现了面向对象对文件路径的处理:
实例:将ttxt文本全部移动到archive目录下

import glob
import os
import shutil

# 获取运行目录下所有的 txt 文件。注意:不是这个文件目录下
print(glob.glob('*.txt'))

for file_name in glob.glob('*.txt'):
    new_path = os.path.join('archive', file_name)
    shutil.move(file_name, new_path)

新的写法:

from pathlib import Path

Path("demo.txt").replace('archive/demo.txt')

路径获取

from pathlib import Path
Path.cwd()
str(Path.cwd()) # 对象转字符
Path.home() # 获取用户 home 目录
Path(__file__) # 获取当前文件路径

获取绝对路径

file = Path('archive/demo.txt')
file.resolve()

获取文件属性

文件属性比如文件大小,创建时间,修改时间等等。

file = Path('archive/demo.txt')
print(file.stat())
print(file.stat().st_size)
print(file.stat().st_atime)
print(file.stat().st_ctime)
print(file.stat().st_mtime)

路径组成部分

name 文件名,包含后缀名,如果是目录则获取目录名。

  • stem 文件名,不包含后缀。
  • suffix 后缀,比如 .txt, .png。
  • parent 父级目录,相当于 cd
  • anchor 锚,目录前面的部分 C:\ 或者 /。
file.stem
file.suffix
file.parent
file.anchor

子路径扫描

  • dir_path.iterdir() 可以扫描某个目录下的所有路径(文件和子目录), 打印的会是处理过的绝对路径
cwd = Path.cwd()
[path for path in cwd.iterdir() if cwd.is_dir()]
  • 使用 iterdir() 可以统计目录下的不同文件类型
path = Path.cwd()
files = [f.suffix for f in path.iterdir() if f.is_file()]
collections.Counter(files)
  • 查找目录下的指定文件 glob
    glob 只会匹配当前目录下, rglob 会递归所有子目录。下面这个例子,demo.txt 在 archive 子目录下。所以用 glob 找到的是空列表,rglob 可以找到。glob 得到的是一个生成器,可以通过 list() 转化成列表。
cwd = Path.cwd()
list(cwd.glob('*.txt'))
list(cwd.rglob('*.txt'))
  • 检查路径是否符合规则 match
file = Path('/archive/demo.txt')
file.match('*.txt')

路径拼接

pathlib 支持用 / 拼接路径。熟悉魔术方法的同学应该很容易理解其中的原理。

Path.home() / 'dir' / 'file.txt'
Path.home().joinpath('dir', 'file.txt')
# C:\Users\me\dir\file.txt

路径判断

  • 是否为文件
  • 是否为文件夹
  • 是否存在
Path("archive/demo.txt").is_file()
Path("archive/demo.txt").is_dir()
Path("archive/demo.txt").exists

文件操作

创建文件touch

exist_ok 表示当文件已经存在时,程序的反应。如果为 True,文件存在时,不进行任何操作。如果为 False, 则会报 FileExistsError 错误

file = Path('hello.txt')
file.touch(exist_ok=True)

创建目录 path.mkdir

用 os 创建目录分为 2 个函数 : mkdir() 和 makedirs()。 mkdir() 一次只能创建一级目录, makedirs() 可以同时创建多级目录:

os.makedirs('dir/subdir/3dir')

使用 pathlib 只需要用 path.mkdir() 函数就可以。它提供了 parents 参数,设置为 True 可以创建多级目录;不设置则只能创建 一层:

path = Path('/dir/subdir/3dir')
path.mkdir(parents=True)

打开文件

使用 open() 函数打开文件时,如果需要传入文件路径。可以用字符串作为参数传入

with open('archive/demo.txt') as f:
    print(f.read())
    
file_path = Path('archive/demo.txt')
with open(file_path) as f:
    print(f.read())

pathlib 对读取和写入进行了简单的封装,不再需要重复去打开文件和管理文件的关闭了
.read_text() 读取文本
.read_bytes() 读取 bytes
.write_text() 写入文本
.write_bytes() 写入 tytes

file_path = Path('archive/demo.txt')
file_path.read_text()
file.write_text('new words')

移动文件

这个操作会把 archive 目录下的 demo.txt 文件移动到当前工作目录,并重命名为 new_demo.txt。

txt_path = Path('archive/demo.txt')
dest = Path('new_demo.txt')
if (not dest.exists()) and dest.parent.exists():
 txt_path.replace(dest)

重命名

txt_path = Path('archive/demo.txt')
new_file = txt_path.with_name('new.txt')
txt_path.replace(new_file)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值