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)