python中用pathlib库解决调用文件路径的问题

一、情况说明

        在python中用logging库或者smtplib库来完成日志和邮件功能的时候,往往可以通过配置文件的形式将部分设置事先定义好,然后通过调用函数读取配置文件的方式来读取设置,这样做的好处是通过封装可以减少代码冗余和更加规范。

        这种方式一般就会有3个文件:

1、ini配置文件,例如:conf.ini

2、读取配置文件(自定义函数),例如:read_conf.py

3、执行文件,例如:demo.py

        代码逻辑是:事先把一些不怎么改变的参数写成一个配置文件,比如name和age,然后写一个函数去读取这个配置文件获得参数,最后在想要用到这些参数的时候直接调用函数就能获取到参数了,如果想要更改参数,只需修改配置文件即可,不需要更改代码,更加灵活和结构化。最终demo.py的运行结果如下:

         但是在实际运行的时候,有可能就会出现因为路径的原因,找不到配置文件导致代码报错。接下来说明了关于写路径的4种方法,其中pathlib库就很好的解决了这个问题。

二、写相对路径的方法(不推荐)

1、最普通也是最直接的方法,就是把相对路径直接写进代码中。

 2、执行文件在调用这个函数的时候,会根据这个路径去找conf.ini文件,因为写的是相对路径,哪个文件调用函数,就会从这个文件的所在路径开始找,很容易出现找不到的情况,就会报错。

3、如果要成功运行demo.py,就需要把demo.py移动到info目录下,这样相对路径./conf_all/conf.ini就能找到了。或者,修改read_conf.py中的相对路径,改为../info/conf_all/conf.ini即可。

4、总结

        执行文件调用函数时,哪个文件调用的,就会从这个文件的当前路径开始找,如果函数中把相对路径写死了,那么其他文件调用时就会找不到路径,要么换目录,要么改路径。 

简易图示:

 

三、通过传参写路径的方法(不推荐)

1、函数中写路径的地方直接写个变量,调用函数时直接把路径通过传参的方式写进去。

read_conf.py中定义变量传参:

demo.py在调用函数时直接把路径作为参数写进去:

 2、总结

        因为调用函数时,哪个文件调用,就会从这个文件的当前路径开始找,所以路径不写死,直接在调用函数时写个路径,在不变更目录和修改read_conf.py代码的前提下解决了找不到ini文件的问题。但缺点是不同目录位置下的文件在调用函数时都要计算当前文件与ini文件的路径关系,多地方调用时路径都要变,会变得非常麻烦。

简易图示:

 

四、写绝对路径的方法(不推荐)

1、read_conf.py里直接写入绝对路径,解决了不同目录位置下的文件在调用该函数时都能正确找到ini文件,不会出现在相对路径下找不到文件的问题。

 2、总结

        函数中写绝对路径,解决了多个文件调用时不用写相对路径的麻烦,但缺点是当该project换了个电脑,或换了个硬盘,从C盘移到了D盘,那么绝对路径就不好使了,可移植性就很差。

简易图示:

五、通过pathlib写路径的方法(推荐)

1、通过pathlib库就可以很好的解决路径问题。

具体说明:

1)path = pathlib.Path(__file__):是获取当前文件的绝对路径,获取到的是C:\Users\78142\PycharmProjects\testProject\info\read_conf.py

2)parents[0]:是获取当前路径的上一级目录,获取到的是C:\Users\78142\PycharmProjects\testProject\info

3)resolve():生成路径

4)/ 'conf_all/conf.ini':表示在原有获取到的路径后面继续追加/conf_all/conf.ini路径,最终形成的路径就是C:\Users\78142\PycharmProjects\testProject\info\conf_all\conf.ini

其实生成的也是绝对路径,但是此方法生成的绝对路径比一般的绝对路径还是有区别的,并不是硬生生写的绝对路径,而是用方法生成的,就算project换了电脑换了硬盘,绝对路径也会跟着变。只要read_conf.py与conf.ini的相对位置不变动,该路径一直有效。

2、总结

        通过pathlib库写的路径,即使其他执行文件(比如demo.py)调用了该函数,路径的查找并不是从执行文件的当前路径开始查找,而是从被调用的函数文件(比如read_conf.py)的当前路径开始找。在read_conf.py中通过pathlib库生成了到conf.ini的路径,那么read_conf.py与conf.ini可以说是绑定在一起了,pathlib获取到的是绝对路径,只要project内的结构不变,任何地方调用该函数,不管执行文件在哪里,都能找到conf.ini文件并读取配置信息。

        通过pathlib获取路径可以更好更灵活地指定到对应的文件。

简易图示:

 

六、其他

实操环境:python版本3.9.10,IDE PyCharm

解决路径问题或获取文件路径的方法有很多,除了pathlib库以外还有os库等,根据场景的不同,可使用其他方法。

本篇文章纯属个人学习总结分享,如有错误欢迎交流。

猜你喜欢

转载自blog.csdn.net/v781423070/article/details/128753759