Python 中如何获取当前目录和文件的上级目录?
Python 获取当前工作目录用 os.getcwd() 或 Path.cwd();获取文件所在目录用 os.path.dirname() 或 Path.parent;脚本自身位置用 __file__。本文对比各种方式。
当前工作目录:os.getcwd() 或 Path.cwd();某文件的上级目录:os.path.dirname(path) 或 Path(path).parent;脚本自身所在目录:Path(__file__).parent(注意和工作目录不是一回事)。
当前工作目录
import os
print(os.getcwd()) # 当前工作目录(进程启动时的目录)
from pathlib import Path
print(Path.cwd()) # 同上,pathlib 风格
文件的上级目录
import os
file_path = '/path/to/file.txt'
print(os.path.dirname(file_path)) # /path/to
from pathlib import Path
print(Path(file_path).parent) # /path/to
print(Path(file_path).parent.parent) # /path——可以再上一级
脚本自身所在目录(重要)
from pathlib import Path
# 无论从哪里运行,都指向脚本文件所在目录
BASE_DIR = Path(__file__).resolve().parent
os.getcwd() vs __file__:前者是"你在哪运行的",后者是"脚本文件在哪"。读配置文件、模板等资源应该用 __file__ 定位,否则换个目录运行就找不到文件。
常见问题(FAQ)
Q:dirname 对相对路径返回什么?
A:原样处理字符串:os.path.dirname('a/b.txt') 返回 'a';os.path.dirname('b.txt') 返回 ''。建议先 os.path.abspath() 转绝对路径。
Q:pathlib 和 os.path 选哪个?
A:新代码用 pathlib——面向对象、运算符拼接(Path('/a') / 'b' / 'c.txt')、跨平台。
Q:Jupyter Notebook 里没有 file?
A:Notebook 中 __file__ 未定义,用 Path.cwd() 或 os.getcwd() 代替。