使用相对路径

时间:2011-07-22 02:06:30

标签: python

当我运行以下脚本时:

c:\Program Files\foo\bar\scripy.py

如何引用目录'foo'

是否有使用相对路径的便捷方式?

我之前使用字符串模块已经完成了,但必须有更好的方法(我在os.path中找不到它。)

4 个答案:

答案 0 :(得分:4)

os.path模块包含用于处理此类路径的各种功能。大多数操作系统的惯例是使用..“向上一级”,所以要获取外部目录,你可以这样做:

import os
import os.path

current_dir = os.getcwd() # find the current directory
print current_dir # c:\Program Files\foo\bar\scripy.py

parent = os.path.join(current_dir, "..") # construct a path to its parent
print parent # c:\Program Files\foo\bar\..

normal_parent = os.path.normpath(parent) # "normalize" the path
print normal_parent # c:\Program Files\foo

# or on one line:
print os.path.normpath(os.path.join(os.getcwd(), ".."))

答案 1 :(得分:1)

os.path.dirname(path)

将返回在path参数上执行的SPLIT的后半部分。 (head - 目录和尾部,文件)简单地说它返回路径所在的目录。你需要做两次,但这可能是最好的方法。

path函数上的Python文档:

http://docs.python.org/library/os.path#os.path.expanduser

答案 2 :(得分:0)

这有点棘手。例如,以下代码:

import sys
import os

z = sys.argv[0]
p = os.path.dirname(z)
f = os.path.abspath(p)

print "argv[0]={0} , dirname={1} , abspath={2}\n".format(z,p,f)

在Windows上提供此输出

argv[0]=../zzz.py , dirname=.. , abspath=C:\Users\michael\Downloads 首先,请注意argv具有我在命令python ../zzz.py中键入的斜杠,并且绝对路径具有正常的Windows反斜杠。如果您需要跨平台,则应该避免在Python命令行上添加常规斜杠,并使用os.sep来引用分隔路径名组件的字符。

到目前为止,我只是部分回答了你的问题。有几种方法可以使用f的值来获得您想要的内容。蛮力就是使用类似的东西:

targetpath = f + os.sep + ".." + os.sep + ".."

这将导致Windows上的C:\Users\michael\Downloads\..\..和Unix上的/home/michael/../..。每个..返回一步,相当于删除路径名组件。

但你可以通过分手来做得更好:

target = f.split(os.sep)
targetpath = os.sep.join(target[:-2]

并重新加入除了最后两位之外的所有内容以在Windows上获得C:\Users并在Unix上获得/。如果这样做,最好检查是否有足够的路径名组件要删除。

请注意,我通过输入python ../xxx.py来运行上面的程序。换句话说,我与脚本不在同一工作目录中,因此getcwd()不会有用。

答案 3 :(得分:0)

我最近开始使用the unipath library而不是os.path。它的面向对象的路径表示更加简单:

from unipath import Path

original = Path(__file__) # .absolute() # r'c:\Program Files\foo\bar\scripy.py'
target = original.parent.parent

print target # Path(u'c:\\Program Files\\foo')

Pathstr的子类,因此您可以将它与标准文件系统函数一起使用,但它也为许多函数提供了替代方法:

print target.isdir() # True

numbers_dir = target.child('numbers')

print numbers_dir.exists() # False
numbers_dir.mkdir()
print numbers_dir.exists() # True

for n in range(10):
    file_path = numbers_dir.child('%s.txt' % (n,))
    file_path.write_file("Hello world %s!\n" % (n,), 'wt')