python3常用库之目录文件库os、pathlib、shutil、glob库
os
常用路径操作
import os
# 当前 Python 运行所在的环境 posix,nt,java
print(os.name) # nt
# os.getcwd()获取当前工作路径
print(os.getcwd())
dir = "./files/foo/bar/bar2"
file = os.path.join(dir, "c.txt")
# os.path.join() 可以将多个传入路径组合为一个路径
print(file)
# 获得绝对路径
path_abs = os.path.abspath(file)
print(path_abs)
# 判断传入路径是否是绝对路径
print(os.path.isabs(path_abs))
# 获得路径中包含的文件名和目录
print(os.path.basename(file))
print(os.path.dirname(file))
# 将路径分割成文件名和目录两个部分,放在一个tuple中返回
print(os.path.split(file))
# 检测目录、文件是否存在
print(os.path.exists(file))
print(os.path.exists(dir))
# 路径是否指向常规文件、目录文件
print(os.path.isfile(file))
print(os.path.isdir(dir))
# 查询文件大小、上一次读取的时间、上一次修改的时间
print(os.path.getsize(file))
print(os.path.getatime(file))
print(os.path.getmtime(file))
# 去除路径path中的冗余
print(os.path.normpath(os.path.join(dir, "../../")))
# 查询多个路径的共同部分
print(os.path.commonprefix([dir, file]))
# os.walk函数需要传入一个路径作为top参数,函数的作用是在以top为根节点的目录树中游走,
# 对树中的每个目录生成一个由(dirpath, dirnames, filenames)三项组成的三元组
for item in os.walk("."):
print(item)
# os.listdir列出(当前)目录下的全部路径(及文件)
def get_filelists(file_dir="."):
list_directory = os.listdir(file_dir)
filelists = []
for file_name in list_directory:
file = os.path.join(file_dir, file_name)
if os.path.isfile(file):
filelists.append(file_name)
return filelists
# print(get_filelists())
# os.makedirs递归创建一个路径,如果指定路径已存在,则会抛出FileExistsError异常
try:
os.makedirs(dir)
except FileExistsError:
print("文件夹已存在")
else:
print("创建成功")
# os.rename()函数的作用是将文件或路径重命名,一般调用格式为os.rename(src, dst)
try:
os.rename("files/a.txt", "files/b.txt")
os.rename("files/b.txt", os.path.join(dir, "c.txt"))
except FileNotFoundError:
print("源文件不存在")
except FileExistsError:
print("目标文件已经存在")
except OSError:
print("没有权限")
else:
print("重命名成功")
# os.remove() 删除文件 os.removedirs 递归删除文件路径
try:
if os.path.isfile(dir):
os.remove(dir)
print("%s 是一个文件" % dir)
else:
os.removedirs(dir)
print("%s 是一个路径" % dir)
except OSError:
print("目錄不是空的")
else:
print("删除成功")
# os.chdir是切换当前工作路径为指定路径
os.chdir("./files")
pathlib
面向对象的文件系统路径
from pathlib import Path
# 文件当前所在目录
path_curr = Path.cwd()
print(path_curr)
# 用户主目录
print(Path.home())
# 目录拼接
print(Path.cwd() / "files")
# 创建、删除目录
(Path.cwd() / "files/foo2").mkdir() # 单层目录
(Path.cwd() / "files/foo2").rmdir() # 单层目录
file = Path.cwd() / "files/a.txt"
# 读写文件
with file.open("w") as f: # 文件不存在即创建后打开。
f.write("python") # 写入 python 字符串。
print(file.read_text()) # python
file.write_text(data="php")
print(file.read_text()) # php
str2byte = bytes("python", encoding="utf-8")
file.write_bytes(str2byte)
print(file.read_bytes()) # b'python'
print(file.read_text()) # python
# 获取文件所在目录的不同部分
ph = Path("files/a.txt").resolve() # 返回文件的完整路径
print(ph) # 文件的完整路径
print(ph.name) #:a.txt 文件完整名称(文件名+后缀名)
print(ph.stem) # a 文件名
print(ph.suffix) # txt 文件后缀名
print(ph.parent) # 文件所在的文件夹名
print(ph.anchor) # 文件所在的盘符
# 判断文件、路径是否存在
print(ph.exists()) # True
print(ph.is_dir()) # False
print(ph.is_file()) # True
# 文件统计以及匹配查找
for val in (Path.cwd() / "files").glob("*.txt"): # 返回直接目录下所有与 pattern 匹配的文件,返回生成器类型
print(val)
for val in (Path.cwd() / "files").rglob("*.txt"): # 返回递归目录下所有与 pattern 匹配的文件,返回生成器类型
print(val)
for val in (Path.cwd() / "files").iterdir(): # 返回直接目录下所有文件及目录,返回生成器类型
print(val)
print(Path.cwd() / "files/")
shutil
shutil模块是Python中强大的文件操作模块,提供了复制、删除、压缩和解压缩文件等高级功能。
# shutil模块是Python中强大的文件操作模块,提供了复制、删除、压缩和解压缩文件等高级功能。
import shutil, os
src_dir = "../../files/"
dst_dir = "../../files/gen/"
# 复制文件内容
shutil.copyfileobj(open(os.path.join(src_dir, "test.txt")), open(os.path.join(src_dir, "test2.txt"), mode="w+"))
# 复制文件或目录,若目的文件存在则覆盖
res = shutil.copy(os.path.join(src_dir, "1.jpg"), os.path.join(dst_dir, "flower.jpg"))
print(res) # ../../files/gen/flower.jpg
res = shutil.copy(os.path.join(src_dir, "1.jpg"), dst_dir)
print(res) # ../../files/gen/1.jpg
# 复制文件
res = shutil.copyfile(os.path.join(src_dir, "1.jpg"), os.path.join(dst_dir, "flower_copy.jpg"))
print(res) # ../../files/gen/flower_copy.jpg
# 复制目录,包括它的所有文件和子目录,若目的文件假存在则报错
res = shutil.copytree(os.path.join(src_dir, "images/"), os.path.join(dst_dir, "backup"))
print(res) # ../../files/gen/backup
# 仅复制权限
res = shutil.copymode(os.path.join(src_dir, "1.jpg"), os.path.join(src_dir, "2.jpg"))
# 拷贝权限、最后访问时间等
res = shutil.copystat(os.path.join(src_dir, "1.jpg"), os.path.join(src_dir, "2.svg"))
# 移动文件或目录
res = shutil.move(os.path.join(src_dir, "test.png"), os.path.join(dst_dir, "test1.png"))
print(res) # ../../files/gen/test1.png
res = shutil.move(os.path.join(src_dir, "backup"), dst_dir)
print(res) # ../../files/gen/backup
# 删除目录
shutil.rmtree(os.path.join(dst_dir, "backup/svg"))
# 修改文件或文件夹的所有者或分组
shutil.chown(os.path.join(dst_dir, "backup"), user="ftp_user", group="ftp_group")
# 获取当前目录所在硬盘使用情况
print(shutil.disk_usage(src_dir))
# 获取给定的cmd命令的可执行文件的路径
print(shutil.which("py"))
# 获取支持的压缩文件格式
print(shutil.get_archive_formats())
# 获取支持的解压文件格式
print(shutil.get_unpack_formats())
# 生成压缩文件
res = shutil.make_archive("gen", format="zip", root_dir=dst_dir, base_dir=src_dir)
# 解压文件
res = shutil.unpack_archive(os.path.join(src_dir, "gen.zip"), extract_dir=os.path.join(src_dir, "gen2"), format="zip")
glob
glob库用来查找匹配的文件或者目录
# glob库用来查找匹配的文件或者目录
import glob, os
dir = "../../files/"
# 匹配指定文件夹下的所有文件及目录
files = glob.glob(os.path.join(dir, "*"))
# print(files)
# 递归匹配指定文件夹及其子文件夹下的所有xls文件
files = glob.glob(os.path.join(dir, "**/*.xls"), recursive=True)
# print(files) #['../../files\\aa.xls', '../../files\\info.xls', '../../files\\gen\\backup\\bb.xls']
# 匹配指定文件夹下的所有.xls和.csv文件
files = glob.glob(os.path.join(dir, "*.xls")) + glob.glob(os.path.join(dir, "*.csv"))
print(files) # ['../../files\\aa.xls', '../../files\\info.xls', '../../files\\pd.csv', '../../files\\test.csv']
# 匹配指定文件夹下面以"test"开头的txt文件
files = glob.glob(os.path.join(dir, "test*.txt"))
print(files) # ['../../files\\test.txt', '../../files\\test2.txt']
# 匹配指定文件夹下面包含"o"的xls文件
files = glob.glob(os.path.join(dir, "*o*.xls"))
print(files) # ['../../files\\info.xls']
# 匹配指定文件夹下面包含数字的txt文件
files = glob.glob(os.path.join(dir, "*[0-9]*.txt"))
print(files) # ['../../files\\test2.txt']
# 匹配指定文件夹下面不包含数字4-9的txt文件
files = glob.glob(os.path.join(dir, "*[!4-9]*.txt"))
print(files) # ['../../files\\pickle.txt', '../../files\\test.txt', '../../files\\test2.txt']
# 匹配指定文件夹下面包含test且test后面有一个字符的txt文件
files = glob.glob(os.path.join(dir, "test?.txt"))
print(files) # ['../../files\\test2.txt']
# 忽略大小写匹配,返回生成器
files = glob.iglob(os.path.join(dir, "*T*.csv"))
print(list(files)) # ['../../files\\test.csv', '../../files\\TEST1.csv']
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix