1、路径操作1.1 旧版 os.path1.1.1 路径拼接 os.path.join将多个字符串拼接成一个路径原型os.path.join(path, *paths):示例importos pos.path.join(laoer,logs,laoer.log)print(p)windows下输出laoer\logs\laoer.loglinux下输出laoer/logs/laoer.log1.1.2 路径拆分 os.path.split将路径拆分成目录和文件名原型os.path.split(path)返回元组 (dir, filename)tuple (head, tail)示例-Windowstestos.path.split(laoer\\logs\\laoer.log)print(test)(laoer\\logs,laoer.log)示例-Linuxtestos.path.split(laoer/logs/laoer.log)print(test)(laoer/logs,laoer.log)1.1.3 其它常用操作1获取目录os.path.dirname(path)2获取文件名os.path.basename(path)3拆分文件名和后缀os.path.splitext(path)4转为绝对路径os.path.abspath(path)5规范化路径消除 ./ …/、多余分隔符os.path.normpath(path)6返回真实物理路径解析软链接os.path.realpath(path)7文本路径是否存在os.path.exists(path)8是否是普通文件存在且不是文件夹os.path.isfile(path)9是否是文件夹os.path.isdir(path)10是否是软链接os.path.islink(path)11获取文件大小os.path.getsize(path)12获取最后访问时间os.path.getatime(path)13最后修改时间os.path.getmtime(path)14获取创建时间os.path.getctime(path)15是否是绝对路径os.path.isabs(path)1.4 新版 pathlibpathlib 是 Python3.4 内置面向对象路径处理Path 对象支持 / 运算符拼接路径天然跨平台from pathlib import Path老旧接口对比功能os.pathpathlib Path路径拼接os.path.join(a,b,c)Path(a)/b/c获取目录os.path.dirname(path)Path(path).parent获取文件名os.path.basename(path)Path(path).name获取文件名-不带后缀os.path.splitext(path)[0]Path(path).stem获取后缀os.path.splitext(path)[1]Path(path).suffix获取绝对路径os.path.abspath(path)Path(path).absolute()规范化路径os.path.normpath(path)Path(path).resolve(strictFalse)获取真实路径os.path.realpath(path)Path(path).resolve()文件是否存在os.path.exists(path)Path(path).exists()是文件吗os.path.isfile(path)Path(path).is_file()是文件夹吗os.path.isdir(path)Path(path).is_dir()是软连接吗os.path.islink(path)Path(path).is_symlink()是绝对路径吗os.path.isabs(path)Path(path).is_absolute()获取文件大小os.path.getsize(path)Path(path).stat().st_size获取修改时间os.path.getmtime(path)Path(path).stat().st_mtime文件一样吗os.path.samefile(p1,p2)Path(p1).samefile(p2)完整示例frompathlibimportPathimporttime# 1. 路径拼接 # os.path.join(/data, logs, app.log)pPath(/data)/logs/app.logprint(路径拼接:,p)输出路径拼接:\data\logs\app.log# 2. 拆分目录 文件 file_pPath(/tmp/demo.txt)# os.path.dirnameprint(父目录:,file_p.parent)输出父目录:\tmp# os.path.basenameprint(文件名:,file_p.name)输出文件名:demo.txt# os.path.splitext 拆分名称和后缀print(文件名不带后缀:,file_p.stem)输出文件名不带后缀:demoprint(文件后缀:,file_p.suffix)输出文件后缀:.txt# 多后缀 .tar.gz 场景p2Path(data.tar.gz)print(stem(只剥最后一层后缀):,p2.stem)输出stem(只剥最后一层后缀):data.tarprint(suffix:,p2.suffix)输出suffix:.gz# 想要一次性拿到全部后缀可以用 suffixesprint(所有后缀列表:,p2.suffixes)输出所有后缀列表:[.tar,.gz]# 3. 绝对路径 / 规范化 / 真实路径 rel_pPath(./test.py)# os.path.abspathabs_prel_p.absolute()print(绝对路径:,abs_p)输出绝对路径:D:\bin\python3.12.10\test.py# os.path.normpath 等价resolve(strictFalse) 不校验文件是否存在norm_pPath(/a//b/../c).resolve(strictFalse)print(规范化路径:,norm_p)输出规范化路径:D:\a\c# os.path.realpath 解析软链接strictTrue 要求文件存在real_prel_p.resolve()print(真实物理路径(解析软链):,real_p)输出真实物理路径(解析软链):D:\bin\python3.12.10\test.py# 4. 存在性 类型判断 test_pathPath(/tmp/demo.txt)# os.path.existsprint(是否存在:,test_path.exists())# os.path.isfileprint(是否普通文件:,test_path.is_file())# os.path.isdirprint(是否文件夹:,test_path.is_dir())# os.path.islinkprint(是否软链接:,test_path.is_symlink())# os.path.isabs 判断绝对路径print(是否绝对路径:,test_path.is_absolute())# 5. 文件大小、时间信息 iftest_path.exists():# os.path.getsizesizetest_path.stat().st_sizeprint(文件大小(bytes):,size)# os.path.getatime / getmtime / getctimestat_infotest_path.stat()atimestat_info.st_atime# 访问时间mtimestat_info.st_mtime# 修改时间常用ctimestat_info.st_ctime# 属性变更时间print(修改时间:,time.ctime(mtime))# 6. samefile 对比两个路径是否同一文件 p_aPath(/tmp/demo.txt)p_bPath(/tmp/./demo.txt)ifp_a.exists()andp_b.exists():print(是否同一个文件:,p_a.samefile(p_b))# 常用组合示例对应之前os.path案例 file_pathPath(/root/code/demo.py)dir_pathfile_path.parent filenamefile_path.name stemfile_path.stem suffixfile_path.suffix new_pathdir_path/f{stem}_bak{suffix}print(新备份路径:,new_path)输出新备份路径:\root\code\demo_bak.py# 创建文件夹pathlib自带无需osifnotdir_path.exists():dir_path.mkdir(parentsTrue,exist_okTrue)# parentsTrue自动创建多级父目录# exist_okTrue目录已存在不会抛异常2、文件操作2.1 打开 open文件打开时moder读w写a追加r读写w 读写打开时直接清空原有内容文件不存在则新建a 可读可追加写入新内容永远写在末尾文件不存在则新建rb wb ab二进制读写fopen(a.txt,moder,encodingutf-8)f.close()推荐 with 自动关闭withopen(a.txt,r,encodingutf-8)asf:dataf.read()2.2 读写、刷新f.read(n)读取 n 个字符f.readline()读取一行f.readlines()读取所有行返回列表f.write(“文本”)写入字符串返回写入长度f.writelines(列表)批量写入多行不会自动加换行f.flush()强制刷缓存到磁盘f.seek(offset)移动文件指针f.tell()获取当前指针位置2.3 创建、删除、重命名os.mkdir(“dir”) 创建单层文件夹os.makedirs(“a/b/c”) 创建多级目录os.rmdir(“dir”) 删除空文件夹os.removedirs(“a/b/c”) 递归删空目录os.remove(“file.txt”) 删除文件os.rename(“old.txt”, “new.txt”) 重命名 / 移动文件os.listdir(path) 列出目录下所有名称字符串2.4 复制、移动shutil 模块中实现的复制、移动、递归删除shutil.copy(src, dst) 复制文件保留权限不复制元数据shutil.copy2(src, dst) 复制文件 保留文件修改时间等元数据shutil.copyfile(src, dst) 仅复制文件内容最简目标必须是文件路径shutil.copytree(src_dir, dst_dir) 递归复制整个文件夹shutil.move(src, dst) 文件 / 文件夹移动、重命名跨分区可靠shutil.rmtree(path) 强制删除非空文件夹高危3、pathlib操作文件3.1 创建文件、文件夹1导入from pathlib import Path2定义p Path(demo.txt)3创建空文件存在也不报错p.touch(exist_okTrue)4创建文件夹Path(data).mkdir(exist_okTrue)5创建多级文件夹Path(a/b/c).mkdir(parentsTrue, exist_okTrue)3.2 一次性读写内部执行open打开、读写、close关闭1读取文本text p.read_text(encodingutf-8)2覆盖写入文本p.write_text(hello world, encodingutf-8)3二进制读写data p.read_bytes() p.write_bytes(bbinary content)3.3 多次读写with open1r 只读with p.open(r, encodingutf-8) as f: f.read()2w 覆盖写with p.open(w, encodingutf-8) as f: f.write(xxx)3a 追加with p.open(a, encodingutf-8) as f: f.write(\nnew line)4r 读写不清空文件with p.open(r, encodingutf-8) as f: f.read() f.write(modify)5二进制读写 rb / wb / abwith p.open(rb) as f: raw f.read()6逐行读写with p.open(r, encodingutf-8) as f: for line in f: print(line.strip())7其它操作和内置open相似readline()readlines()write()writelines()seek()tell()flush()