如何解析python中的相对路径?

How to resolve relative paths in python?

我有这样的目录结构

1
projectfolder/fold1/fold2/fold3/script.py

现在我给script.py一个路径,作为一个文件的命令行参数,该文件位于

1
fold1/fold_temp/myfile.txt

所以基本上,我希望能够以这种方式给出道路

1
2
3
../../fold_temp/myfile.txt

>>python somepath/pythonfile.py -input ../../fold_temp/myfile.txt

这里的问题是,我可能会得到完整的路径或相对路径,所以我应该能够决定,并在此基础上,我应该能够创建绝对路径。

我已经了解了与路径相关的功能。

问题1

问题2

参考问题给出了部分答案,但我不知道如何使用其中提供的函数构建完整路径。


尝试os.path.abspath,它应该执行您想要的操作;)

基本上,它将任何给定路径转换为您可以使用的绝对路径,因此您不需要区分相对路径和绝对路径,只需使用此函数规范化其中的任何路径。

例子:

1
2
3
from os.path import abspath
filename = abspath('../../fold_temp/myfile.txt')
print(filename)

它将输出文件的绝对路径。

编辑:

如果您使用的是python 3.4或更高版本,那么也可以使用pathlib.path的resolve()方法。请注意,这将返回路径对象而不是字符串。如果需要字符串,您仍然可以使用str()将其转换为字符串。

例子:

1
2
3
from pathlib import Path
filename = Path('../../fold_temp/myfile.txt').resolve()
print(filename)


对于python3,可以使用pathlib的解析功能解析symlinks和..组件。

您需要有一个path对象,但是在str和path之间进行转换非常简单。

我建议任何使用python3删除os.path及其混乱的长函数名并坚持使用pathlib路径对象的人。


一个实际例子:

sys.argv[0]给出了当前脚本的名称

os.path.dirname()为您提供了相对目录名

因此,下一行给出当前执行文件的绝对工作目录。

cwd = os.path.abspath(os.path.dirname(sys.argv[0]))

就我个人而言,我总是使用这个而不是os.getcwd(),因为它给了我脚本绝对路径,独立于调用脚本的目录。


1
2
3
4
5
6
7
8
import os
dir = os.path.dirname(__file__)
path = raw_input()
if os.path.isabs(path):
    print"input path is absolute"
else:
    path = os.path.join(dir, path)
    print"absolute path is %s" % path

使用os.path.isabs判断输入路径是绝对路径还是相对路径,如果是相对路径,则使用os.path.join将其转换为绝对路径