python路径
ref
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】
在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()
在main.py文件中:
from model import test
test.test()
报错结果:分别运行两个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 # 父目录
注意:
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'
# 创建目录
if not os.path.exists(Data_dir):
print("Data_dir is not exist,creating")
os.makedirs(Data_dir)
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))
好用的路径方法
添加搜索路径:
一般而言,从src开始导入即可,就是接着xxx/src
往后接就行
import sys
root_path = os.path.abspath(os.path.dirname(__file__)).split('src')
sys.path.extend([root_path[0] + 'src'])
提取特定目录下的子目录里的特定格式的全部文件:
from glob import glob
self.img_path = glob(os.path.join(config.dataset_root, '*', '**.*'))
分析:提取符合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)