• python路径的麻烦事


    python路径

    ref

    Python 判断文件/目录是否存在

    Python 解决相对路径问题:“No such file or directory”【解决调用时,相对路径的问题】

    python的相对路径

    在pycharm中运行py文件,使用相对路径加载文件,基准路径是运行脚本的所在目录,也就是os.os.getcwd()的返回结果,也就是,工作目录

    也就是说,是你要加载的目标文件相对于工作目录wdir的路径(就是你运行的那个文件所在目录,调用的就不算了,就是第一次最初运行的那个py文件所在目录),而不是你所在的py文件(指的是做加载文件操作的那个py文件)相对你要加载的目标文件的路径。

    所以这可能会导致如下错误:

    实验说明

    一种做法,比如你有如下文件结构:

    -src
    
    ​	-model
    
    ​		-test.py【你所在位置,你要读取read.npy文件】
    
    ​		-read.npy
    
    ​	-main.py【调用了test.py】
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在test.py文件中:

    import numpy as np
    import torch
    
    
    def test():
        embedding_matrix = torch.as_tensor(np.load("model/read.npy"))	#运行test.py文件时,报错;运行main.py文件时,正常
        embedding_matrix = torch.as_tensor(np.load("read.npy"))# 与上面相反
        print(embedding_matrix)
    
    if __name__ == '__main__':
        test()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在main.py文件中:

    from model import test
    
    test.test()
    
    • 1
    • 2
    • 3

    报错结果:分别运行两个py文件,会发现其wdir不一样,因此需要在这个基础上编写相对路径

    路径操作

    os.path.abspath(path) # 返回绝对路径。os.path.abspath取决于os.getcwd,如果是一个绝对路径,就返回,如果不是绝对路径,根据编码执行getcwd/getcwdu.然后把path和当前工作路径连接起来.
    os.path.isabs(path) # 判断是否是绝对路径
    os.path.relpath(path, start) # 返回从 start 路径到 path 的相对路径的字符串(即path相对start的相对路径)。如果没有提供 start,就使用当前工作目录作为开始路径。
    os.path.exists() # 检测文件是否存在
    os.getcwd() # 返回当前运行文件所在目录的绝对路径(就是工作目录)。注意,是,当前运行文件所在目录。在哪运行,所有此次运行用到这个函数的,它的返回都是这个目录路径
    os.path.curdir # 返回`.`
    os.path.dirname(path) # 返回path中最后一个斜杠之前的字符串
    os.path.basename(path) # 返回path中最后一个斜杠之后的字符串
    sys.path.append("待加入的搜索路径") # 依赖搜索路径
    current_path = os.path.dirname(__file__) # 返回该文件的绝对路径,与从哪里开始运行无关,结合相对路径使用,可以传递路径!!!
    os.pardir # 父目录 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    注意:

    • os.getcwd()会随着运行脚本所在目录的改变而改变
    • os.path.abspath(path) 返回结果取决于os.getcwd(),如果是一个绝对路径,就返回,如果不是绝对路径,根据编码执行getcwd/getcwdu然后把path和当前工作路径连接起来.
    • os.path.relpath(path, start),如果没有提供 start,就使用当前工作目录(os.getcwd())作为开始路径。

    demo

    >>> os.getcwd()
    'C:\\Windows\\System32'
    >>> os.path.abspath('.')
    'C:\\Windows\\System32'
    >>> os.path.abspath('.\\Scripts')
    'C:\\Windows\\System32\\Scripts'
    >>> os.path.isabs('.')
    False
    >>> os.path.isabs(os.path.abspath('.'))
    True
    >>> os.path.relpath('C:\\Windows', 'C:\\')
    'Windows'
    >>> os.path.relpath('C:\\Windows', 'C:\\spam\\eggs')
    '..\\..\\Windows'
    >>> path = 'C:\\Windows\\System32\\calc.exe'
    >>> os.path.basename(path)
    'calc.exe'
    >>> os.path.dirname(path)
    'C:\\Windows\\System32'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    # 创建目录
    if not os.path.exists(Data_dir):
        print("Data_dir is not exist,creating")
        os.makedirs(Data_dir)
    
    • 1
    • 2
    • 3
    • 4

    demo1

    import os
    
    print(os.getcwd())
    
    names = ['pbc_IMR90', 'GM12878', 'HUVEC', 'HeLa-S3', 'IMR90', 'K562', 'NHEK']
    cell_name = names[4]
    feature_name = "elmo"
    Data_dir = '../../data/epivan/%s/%s/' % (cell_name, feature_name)
    print(os.path.abspath(Data_dir))
    train_dir = '../../data/epivan/%s/train/' % cell_name
    print(os.path.abspath(train_dir))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    好用的路径方法

    添加搜索路径

    一般而言,从src开始导入即可,就是接着xxx/src往后接就行

    import sys
    
    root_path = os.path.abspath(os.path.dirname(__file__)).split('src')
    sys.path.extend([root_path[0] + 'src'])
    
    • 1
    • 2
    • 3
    • 4

    提取特定目录下的子目录里的特定格式的全部文件:

    from glob import glob
    self.img_path = glob(os.path.join(config.dataset_root, '*', '**.*'))
    
    • 1
    • 2

    分析:提取符合dataset_root/*/**.*路径格式的所有文件

    相对路径的处理

    os.getcwd()会随着运行脚本所在目录的改变而改变,所以没用。

    因此,使用_current_path+相对路径的办法,这里的相对路径指,相对当前文件的路径。

    _current_path = os.path.dirname(__file__)
    _ex_root = '../result/'
    _result_dir = "electra/"
    loss_pic_name = "electra_loss"
    ex_result_dir = os.path.join(_current_path, _ex_root, _result_dir)
    print(ex_result_dir)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    HTTP状态码
    低代码平台AWS PaaS_安装应用商店的标准应用(安装单一应用)
    Qt事件机制
    【图像分割】基于和声搜索算法实现图像多级阈值分割附matlab代码
    【Leetcode】top 100 贪心算法
    【2022.11.16】Lammps+Python+MATLAB在绘制维诺图时遇到的问题
    高精度算法详解
    Kafka入门04——原理分析
    ASP.NET CORE在docker中的健康检查(healthcheck)
    干货 | 如何快速实现 BitSail Connector?
  • 原文地址:https://blog.csdn.net/qq_37774098/article/details/126376284