当我运行以下脚本时:
c:\Program Files\foo\bar\scripy.py
如何引用目录'foo'
?
是否有使用相对路径的便捷方式?
我之前使用字符串模块已经完成了,但必须有更好的方法(我在os.path
中找不到它。)
答案 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文档:
答案 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')
Path
是str
的子类,因此您可以将它与标准文件系统函数一起使用,但它也为许多函数提供了替代方法:
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')