一、缘起
二、环境
用相对目录指定文件的位置,这种写法比较简洁,如果想让文件生成在Python程序所在的目录下,对于文本文件,可以直接写文件名。例如:

这个代码在IDLE中运行无误,生成的文本文件test.txt就在Python程序所在的目录下。但该程序用命令行方式运行时,生成的文本文件test.txt总是在CMD窗口的当前目录下,而这个当前目录可能不会刚好是Python程序所在的目录。
如果生成的是Word之类的office文件,pywin32扩展库要求用绝对路径,相对路径的办法就行不通,在《Windows环境变量Path与Python的命令行运行》一文中,我们用 abspath("test.doc") 来获取绝对路径,但程序运行的时候,也是IDLE方式生成的Word文件位置能够如愿,命令行方式生成的位置未能如愿。
用绝对路径指定文件的位置,这种写法可能会因为路径较长而显得代码冗长,但它的好处是无论IDLE运行还是命令行运行,在程序成功运行后,都能把文件生成在希望的目录下。例如:

变绝对目录的意思是本质上还是用绝对路径指定文件的位置,但绝对路径不是写死在程序代码中的,而是临时获取的。无论Python程序放到什么目录下,我们总能确定这个目录的绝对路径,并把文件生成在这个绝对路径下。例如:

这里先获取Python程序所在的目录赋值给变量p,然后用os.path.join把这个目录p跟文件名fn连接起来得到文件的绝对路径名。
这样做的好处是显而易见的,无论把Python程序放在什么目录下,只要这个目录是可写的,那么,程序运行后总能把文件生成到同一个目录下。
这种方法生文件所在的目录是可变的,所以可称为变绝对目录。
我们还可以用变绝对目录来确定要读取文件的绝对路径,或者是要读写的目录的绝对路径。
除了用
dirname(abspath(__file__))
本号几年前曾在《获取当前Python脚本的绝对路径的正确方法》一文中探讨过这个问题,文章的结论是:
要获取当前脚本的绝对路径,用
os.path.split(os.path.abspath(__file__))[0]
事实上,当时小编刚接触Python,还不知道可以用os.path.dirname更简单一些,而且用了“唯一”这样的字样,用词太绝对,非常不恰当。现在看来,用
dirname(abspath(__file__))




