暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python文件操作的相对目录、绝对目录和变绝对目录

语和言 2022-02-14
420

一、缘起

上次本号在《Windows环境变量Path与Python的命令行运行》一文中提到一个Python程序,那个程序在IDLE中能运行,在程序目录下生成一个Word文件test.doc。但是用命令行方式成功运行之后,生成的Word文件test.doc却不在程序目录下。具体在哪个目录下呢?这要看Windows的CMD窗口中的当前目录是什么。test.doc就生成在这个当前目录下。
那么,有什么办法能让生成的Word文件test.doc始终都出现在Python程序所在的目录下吗?答案是肯定的。
我们熟悉了Python文件操作中的相对目录、绝对目录、变绝对目录之后之后,就知道答案了。

二、环境


Win 10 中文专业版64位 + Python 3.65 64位



三、相对目录 


用相对目录指定文件的位置,这种写法比较简洁,如果想让文件生成在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程序所在的目录之外,还有什么简单的方法来得到这个目录吗?

本号几年前曾在《获取当前Python脚本的绝对路径的正确方法》一文中探讨过这个问题,文章的结论是:

要获取当前脚本的绝对路径,用

       os.path.split(os.path.abspath(__file__))[0]

是唯一完美的方法。

事实上,当时小编刚接触Python,还不知道可以用os.path.dirname更简单一些,而且用了“唯一”这样的字样,用词太绝对,非常不恰当。现在看来,用

        dirname(abspath(__file__))

应该是比较简单的一种方法。



七、后记


欢迎指出本文的不足之处,欢迎就本文的相关问题跟作者进行交流,如需联系作者,请发邮件到 tbv_me@163.com

文章转载自语和言,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论