Pythonos.path模块常见用法:路径拼接、目录操作与批量文件处理
os.path模块提供跨平台路径处理,包括路径拼接(注意绝对路径覆盖)、路径与文件名分离、安全创建目录、批量复制与重命名文件等核心功能,并支持递归遍历目录,需注意路径分隔符差异与操作前路径检查。
在日常 Python 开发中,文件和目录操作可以说是家常便饭。只要和文件系统打交道,os.path 模块几乎就是绕不开的工具箱。它最大的好处是跨平台,不用操心 Windows 和 Linux 下路径分隔符的差异。下面直接用实例来拆解它的核心用法,看看在路径拼接、目录创建、文件批量复制与重命名这些场景下,到底怎么用才顺手。
一、路径拼接:os.path.join()
语法其实很简单:
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 方法速查
下面这个表格整理了最常用的几个方法,平时写代码时可以直接对照:
| 方法 | 说明 |
|---|---|
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) | 分离文件名与扩展名 |
九、注意事项
- 路径分隔符:Windows 用的是反斜杠
\,Linux/macOS 用的是斜杠/。千万不要自己手动拼接字符串,老老实实用os.path.join就好。 - 相对/绝对路径:如果不确定当前路径是什么,可以先调用
os.path.abspath转成绝对路径,这样定位问题的时候会更清晰。 - 操作前检查:删除或修改文件之前,养成用
os.path.exists判断一下的好习惯。这能省去很多不必要的异常处理。
以上这些就是 os.path 模块在实际开发中最常见的用法。掌握好它们,你会发现文件系统相关的代码写起来顺手得多,而且跨平台兼容性也不用额外操心。


































