在文件路径处理中,相对路径的概念取决于我们选择的”基准点”(即参考的起始点)。默认情况下,许多程序和工具(包括Jupyter Notebook)会将”当前工作目录”(即当前执行文件的目录)作为路径解析的起点。这种设计在单文件项目中工作良好,但在大型项目中可能会导致路径引用混乱。

举个例子:

假设你有以下文件结构:

1
2
3
4
5
6
test
├── projects
│ ├── notebook.ipynb
│ └── demo.py
└── data
└── file.txt

假设你有一个项目,其中:

  • 根目录为 test,下面有projectsdata两个文件夹
  • 当前正在编辑 projects/notebook.ipynbprojects/demo.py
  • 在这个代码中,需要通过相对路径访问 data/file.txt
  • 如果项目后续扩展,可能会添加更多的子目录和文件

1. vscode中默认方式:从当前文件出发获取 data/file.txt 的相对路径

1
2
3
4
5
6
# 代码示例
file_path = "../data/file.txt" # 相对路径,即从当前打开的文件的目录出发,去检索'data/file.txt'的相对地址

# 如果文件层级更深,可能需要更多的../
# 例如在 projects/subfolder/notebook.ipynb 中访问data/file.txt
file_path = "../../data/file.txt" # 这种方式容易出错且难以维护

这是vscode中默认的相对路径获取方法,即路径会是从当前文件(notebook.ipynb或者demo.py)所在的目录出发的来查找 data/file.txt。这种方式的主要问题是:当文件位置变动时,需要相应调整../的数量,容易导致错误。

2. 从vscode打开的项目的根目录(test)出发进行检索

vscode中提供了通过右键复制相对路径的方式,但是生成的路径默认是从当前项目的根目录test出发,而不是从当前执行文件的目录projects/notebook.ipynb进行索引,右键复制会获得以下相对路径:

1
2
3
4
5
6
# 代码示例
file_path = "data/file.txt" # 从根目录出发的路径,更清晰且稳定

# 即使文件位置变动,路径依然保持不变
# 在任何位置都可以使用相同的路径
data_file = "data/file.txt"

1736737384940.png

修改相对路径

1. 针对jupyter notebook脚本的相对路径修改

在vscode设置选项中搜索Notebook File Root,将Notebook File Root更改${fileDirname}${workspaceFolder},这么做的意思是,jupyter notebook的文件路径会从当前打开的项目的根目录test出发,而不是从当前执行文件的目录projects/notebook.ipynb进行索引。
具体步骤:

  1. 打开VSCode设置(Ctrl+,)
  2. 搜索”Notebook File Root”
  3. 找到”Jupyter: Notebook File Root”选项
  4. 将默认值${fileDirname}改为${workspaceFolder}
  5. 重启Jupyter内核以使设置生效

1736737446749.png

2. 针对普通的python脚本的相对路径修改

在vscode设置选项中搜索Execute In File Dir,vscode中该选项默认是勾选的,将Execute In File Dir取消勾选,这么做的意思是,python脚本的文件路径会从当前打开的项目的根目录test出发,而不是从当前执行文件的目录projects/notebook.ipynb进行索引。

具体步骤:

  1. 打开VSCode设置(Ctrl+,)
  2. 搜索”Execute In File Dir”
  3. 找到”Python > Terminal: Execute In File Dir”选项
  4. 取消勾选此选项
  5. 重启VSCode终端以使设置生效
    1736737410503.png