相对路径 vs 绝对路径

这是文件路径系列的第3篇。很多网友碰到找不到文件的问题,都是因为对Python读取文件路径的知识理解不深。本周的每天3分钟,我们就主要围绕路径问题。

今天主要从概念上再聊一下相对路径和绝对路径。内容是是从我出版的书Python办公效率手册中的一段。

初学者经常会被读取不到文件的问题所困扰。遇到这种问题首先看自己是否有拼写错误,然后就是要理解好本节的内容:文件路径。

1)相对路径

前面的代码在读取文件时,并没有指明文件所在的目录。默认情况下,Python会以执行Python命令的目录为起点查找文件:

with open('zen.txt', 'r') as f:
    print(f.read())

假设我的程序和数据文件都放在C:\maishu\files下:

  • 程序:learn_path.py
  • 文件:zen.txt

如果在C:\maishu目录下执行Python命令:

python files\learn_path.py

程序会报错:

FileNotFoundError: [Errno 2] No such file or directory: 'zen.txt'

这是因为在C:\maishu目录下并没有zen.txt。zen.txt在C:\maishu\files下。有两种方法来处理这个错误:

1.在C:\maishu\files下去执行命令: python learn_path.py,这时因为执行的目录就是在files下,所以去files下可以找到zen.txt,就不会报错了。

2.仍然在C:\maishu下执行命令:python files/learn_path.py,但把代码修改一下:

with open('files/zen.txt', 'r') as f:
    print(f.read())

因为读取文件的时候写的是"files/zen.txt",所以会在C:\maishu下的files文件夹中去读取zen.txt,也没问题了。

这叫做**相对路径,**Python会以执行脚本的目录为起点去查找文件。

  • 相对路径可以引用子目录,比如"folder1/folder1/file.txt"是指当前目录下的子目录folder1下的下一级子目录folder2下的文件file.txt。
  • 相对路径可以引用上一级目录,用两个点“…”表示上一级目录。比如:
  • "…/folderx/filex.txt"表示上一级目录下的folderx下的文件filex.txt。
  • "…/…/folderx/filex.txt"表示上一级目录的再上一级目录下的folderx目录下文文件filex.txt。

举个例子,帮你更好地理解相对路径:

  • 往前走100米,左转,然后再走200米,就能找到宝贝。

宝贝的位置是相对于当时说这句话的人所在的位置,在不同的地方说这句话就会导致不同的宝贝地址。

2)绝对路径

相对路径虽然方便,但也有很大的局限性,在不同的目录下执行程序可能会产生不同的结果。为了稳定可靠,我们可以指定文件的完整目录,也就是绝对路径。这样不管在哪里执行程序,都能够正确地读取到文件。

file = "C:/maishu/files/zen.txt"
with open(file, 'r') as f:
    print(f.read())

因为file的路径是从盘符开始的,也就是指定了绝对路径,不管在哪个目录下执行python命令,都会去C:/maishu/files的目录下找zen.txt。

在Windows上,从盘符开始的路径,就是绝对路径,它指明了绝对的地址。

“对于Linux或者MacOS的操作系统,绝对路径是从斜杠开始的,比如/users/maishu/files/zen.txt。

用上面的例子来理解绝对路径:

  • 在中国,北京市,长安街第128号,从东往西,往前走100米,左转,然后再走200米,就能找到宝贝。

这是一个绝对地址,不管在什么地方告诉你,你都可以正确无误地找到这个绝对地址。