发布于2026-07-01 阅读(0)
扫一扫,手机访问
在日常 Python 开发中,文件和目录操作可以说是家常便饭。只要和文件系统打交道,os.path 模块几乎就是绕不开的工具箱。它最大的好处是跨平台,不用操心 Windows 和 Linux 下路径分隔符的差异。下面直接用实例来拆解它的核心用法,看看在路径拼接、目录创建、文件批量复制与重命名这些场景下,到底怎么用才顺手。
语法其实很简单:
os.path.join(path1[, path2[, ...]])
返回值就是把多个路径拼成一个完整的字符串。
这里有一个特别容易踩的坑:第一个绝对路径之前的参数会被直接忽略。什么意思呢?看个例子:
import os
# 全部相对路径
print(os.path.join('/hello/', 'good/boy/', 'doiido'))
# 输出:/hello/good/boy/doiido
# 中间出现绝对路径
print(os.path.join('/hello/', '/good/boy/', 'doiido'))
# 输出:/good/boy/doiido (/hello/ 被忽略)
也就是说,如果后面出现了一个以斜杠开头的路径,前面的内容会被全部丢弃。这一特性在拼接用户输入或者配置文件中的路径时,需要特别留意。
很多时候,拿到一个完整路径,我们需要分别取出文件名和目录。用 os.path.basename 和 os.path.dirname 就能搞定:
url = 'https://images0.cnblogs.com/i/311516/201403/020013141657112.png' filename = os.path.basename(url) # '020013141657112.png' filepath = os.path.dirname(url) # 'https://images0.cnblogs.com/i/311516/201403'
如果想把这两者同时拿到,用 os.path.split 更方便:
parts = os.path.split('/home/user/data/file.txt')
# ('/home/user/data', 'file.txt')
返回的是一个元组,前半部分是目录,后半部分是文件名。
写脚本时经常需要创建一个不存在的目录。最稳妥的做法是先判断,再创建,而且最好支持多级目录。一个典型的工具函数长这样:
def mkdir(path):
if not os.path.exists(path):
os.makedirs(path)
print("--- create new folder %s ---" % path)
else:
print("--- already ha ve this folder! ---")
注意这里用的是 os.makedirs,它会递归创建所有不存在的父目录,比 os.mkdir 省心得多。
有些场景下,我们不光要创建目录,还要在目录里生成一个空文件。把刚才的 mkdir 和 os.path.split 结合起来,就是一个很实用的组合拳:
def create_empty_file(path):
dir, file = os.path.split(path)
mkdir(dir)
open(path, "w").close()
这样一来,无论传入什么路径,父目录都会自动建立好,文件也能顺利创建。
假设有一个源目录,里里外外有很多子文件夹,你想把所有 .jpg 和 .png 图片都复制到一个统一的目标目录里。用 os.walk 配合 shutil.copy 就能做到:
import shutil
def cp_rawdata_snp_2_plate_snp_path(path, new_path):
for root, dirs, files in os.walk(path):
for file in files:
if file[-3:].lower() in ('jpg', 'png'):
src = os.path.join(root, file)
dst = os.path.join(new_path, file)
shutil.copy(src, dst)
os.walk 会递归遍历所有子目录,root 是当前所在的目录,files 是该目录下的文件列表。判断文件扩展名时直接用切片取后三个字符,简单高效。当然,如果扩展名不统一,也可以用 os.path.splitext 更精确地匹配。
重命名文件是文件操作里的高频场景。比如,有一批 .gtc 文件,需要根据一个映射字典把文件名改成对应的 vcf 文件名。代码可以这样写:
def rename_gtc_barcode():
barcode_map = {"2012333_r1l2": "111-1214-1232"}
gtc_path = config["dir.gtc_dir_path"]
for i in os.listdir(gtc_path):
if not i.endswith(".gtc"):
continue
oldname = os.path.join(gtc_path, i)
newname = os.path.join(gtc_path, barcode_map[i.replace(".gtc", "")] + ".vcf")
os.rename(oldname, newname)
print(oldname, '======>', newname)
核心思路是:先遍历目录下所有文件,过滤出目标后缀,然后用字典映射构建新的文件名,最后用 os.rename 完成操作。打印出前后对比,方便检查结果。
在脚本中定位路径时,经常需要知道当前脚本所在的目录,或者返回到上一级、上两级目录。几种常见写法如下:
import os # 当前目录 print(os.getcwd()) print(os.path.abspath(os.path.dirname(__file__))) # 上级目录 print(os.path.abspath(os.path.dirname(os.getcwd()))) print(os.path.abspath(os.path.join(os.getcwd(), ".."))) # 上上级目录 print(os.path.abspath(os.path.join(os.getcwd(), "../..")))
os.getcwd() 返回的是当前工作目录,而 __file__ 是脚本文件本身所在的路径。两者有时并不一致,需要区分使用。获取上级目录时,用 os.path.join 拼接 ".." 是最直观的做法。
下面这个表格整理了最常用的几个方法,平时写代码时可以直接对照:
| 方法 | 说明 |
|---|---|
os.path.abspath(path) | 返回绝对路径 |
os.path.basename(path) | 返回文件名 |
os.path.dirname(path) | 返回目录路径 |
os.path.exists(path) | 路径是否存在 |
os.path.isfile(path) | 是否为文件 |
os.path.isdir(path) | 是否为目录 |
os.path.getsize(path) | 文件大小(字节) |
os.path.splitext(path) | 分离文件名与扩展名 |
\,Linux/macOS 用的是斜杠 /。千万不要自己手动拼接字符串,老老实实用 os.path.join 就好。os.path.abspath 转成绝对路径,这样定位问题的时候会更清晰。os.path.exists 判断一下的好习惯。这能省去很多不必要的异常处理。以上这些就是 os.path 模块在实际开发中最常见的用法。掌握好它们,你会发现文件系统相关的代码写起来顺手得多,而且跨平台兼容性也不用额外操心。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8