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】

在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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值