【问题标题】:How to resolve relative paths in python?如何解析python中的相对路径?
【发布时间】:2015-12-26 15:01:24
【问题描述】:

我有这样的目录结构

projectfolder/fold1/fold2/fold3/script.py

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

fold1/fold_temp/myfile.txt

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

../../fold_temp/myfile.txt 

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

这里的问题是我可能会获得完整路径或相对路径,因此我应该能够决定并基于此我应该能够创建绝对路径。

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

Question 1

Question 2

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

【问题讨论】:

  • 如果用户传入了正确的路径,你为什么要关心它是绝对的还是相对的? Python 肯定不在乎,您的用户也可能不在乎。

标签: python path


【解决方案1】:

试试os.path.abspath,它应该做你想做的;)

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

例子:

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

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

编辑:

如果您使用的是 Python 3.4 或更高版本,您还可以使用 pathlib.Pathresolve() 方法。请注意,这将返回一个 Path 对象而不是字符串。如果您需要字符串,您仍然可以使用str() 将其转换为字符串。

例子:

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

【讨论】:

  • 提供一个小例子……比链接好;否则,一个很好的答案,会被投票赞成......
【解决方案2】:
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转换为绝对路径

【讨论】:

  • 这不能作为解决方案,因为在 dir 路径中,您将拥有脚本文件的路径,根据问题,我不想将其作为路径..
  • 在相关链接中提供了更相似的解决方案......如果您的输入文件位于同一目录或某些具有相同父级的子目录中,则完全没问题
  • os.path.join(dir, path) 已经等于 path,如果 path 是绝对的(在 Pyhon 3.6 上测试)。
  • 我面临另一种情况,这个方法对我有用,谢谢
【解决方案3】:

对于 Python3,您可以使用 pathlib 的 resolve 功能来解析符号链接和 .. 组件。

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

我建议任何使用 Python3 的人放弃 os.path 及其凌乱的长函数名称并坚持使用 pathlib 路径对象。

【讨论】:

  • 一些例子会很有用。
【解决方案4】:

一个实际的例子:

sys.argv[0] 为您提供当前脚本的名称

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

因此,下一行为您提供当前执行文件的绝对工作目录。

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

就我个人而言,我总是使用它而不是 os.getcwd(),因为它为我提供了脚本绝对路径,与调用脚本的目录无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 2014-01-30
    • 2019-02-23
    • 1970-01-01
    • 2010-10-03
    相关资源
    最近更新 更多