• 【python】路径管理+路径拼接问题


    问题

    环境:python3.7.16 win10

    相对路径问题

    因为python的执行特殊性,使用相对路径时,在不同路径下用python指令会有不同的索引效果(python的项目根目录是根据执行python语句时的根目录,像是其他项目因为有包管理工具vue-cli或webpack等进行管理,会固定项目根目录),所以最好规定执行项目路径。
    在这里插入图片描述
    上图中第一次运行跟路径是’S:\varcode-project\py’,第二次是’S:\varcode-project’

    绝对路径问题

    使用绝对路径时,项目移动时,索引基本会发生错误(因为项目的路径变化了)。

    解决

    因此,最好使用绝对路径+相对路径组合的形式。只要我规定文件内路径按照项目路径来写相对路径,并通过绝对路径计算出当前项目路径,将两者加以组合,那么无论项目如何移动路径索引都没问题了。

    os库

    import os
    
    # 绝对路径  
    absolute_path = os.path.abspath(__file__)
    # 相对路径  
    relative_path = "..\data\历史时间序列表.csv"  
    # 连接路径  
    combined_path = os.path.join(absolute_path, relative_path)  
      
    print(absolute_path, relative_path)
    print(combined_path)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    很明显出现拼接错误,os.path.join函数只能将’s:\path’与’data.csv’组合,即在两个字符串中间简单加个’\',并不能正确解析双点‘..’的意义,因此这个方法不行。

    pathlib库

    from pathlib import Path  
      
    # 相对路径  
    relative_path = Path("..\data\历史时间序列表.csv")  
      
    # 获取绝对路径  
    absolute_path = relative_path.resolve()  
      
    print(relative_path)
    print(absolute_path)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述
    一样会根据python语句的执行目录发生变化,因此这个方法也不行。

    最终解决

    os库藏了一个很鸡贼的方法os.path.normpath(path),并且无论你是问chat-gpt还是自己搜索相关问题,都不会给出这个函数。

    import os
    
    # 绝对路径  
    absolute_path = os.path.abspath(__file__)
    # 相对路径  
    relative_path = "..\data\历史时间序列表.csv"  
    # 先将当前文件的绝对路径的目录和相对路径拼接,然后使用normpath进行路径规范化  
    combined_path = os.path.normpath(os.path.join(os.path.dirname(absolute_path), relative_path)) 
      
    print(absolute_path, relative_path)
    print(combined_path)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    最终解决2

    可能有小伙伴发现以上方案还是不能使代码在linux上正常运行。
    在这里插入图片描述
    这是因为在linux路径分割符不是反斜杠’\‘,而是斜杠’/',具体参考这篇文章。并且使用斜杠后windows上的代码也能正常运行,因此最好培养自己写路径用斜杠的好习惯。修改代码如下:

    import os
    
    # 绝对路径  
    absolute_path = os.path.abspath(__file__)
    # 相对路径  
    relative_path = "../data/历史时间序列表.csv"  
    # 先将当前文件的绝对路径的目录和相对路径拼接,然后使用normpath进行路径规范化  
    combined_path = os.path.normpath(os.path.join(os.path.dirname(absolute_path), relative_path)) 
      
    print(absolute_path, relative_path)
    print(combined_path)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    在商业领域如何开展数据挖掘
    计算机视觉与机器学习D1
    企业软件产品和服务 之 设计保证安全 七项承诺
    bat脚本-不关闭窗口
    【全网最细致】SpringBoot整合Spring Security + JWT实现用户认证
    Java面试八股之myBatis动态SQL的作用
    大数据生态圈及分布式文件系统HDFS实践-part1
    XMLHttpRequest对象
    【微服务保护】初识 Sentinel —— 探索微服务雪崩问题的解决方案,Sentinel 的安装部署以及将 Sentinel 集成到微服务项目
    Linux网络编程——套接字socket
  • 原文地址:https://blog.csdn.net/yiself/article/details/134168432