2011-07-22 218 views
1

工作當我運行下面的腳本:相對路徑

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

我怎麼能參考目錄'foo'

有沒有一種使用相對路徑的方便方法?

我以前用字符串模塊做過,但必須有更好的方法(我找不到它在os.path)。

+0

三片歡呼聲! – cledoux

回答

1
os.path.dirname(path) 

將返回執行SPLIT下半年在路徑參數上。 (頭 - 目錄和尾部,文件)簡單地說,它返回路徑所在的目錄。你需要做兩次,但這可能是最好的方法。

Python文檔上path功能:

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

+0

謝謝(全部),完美的工作。 – Dominik

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(), "..")) 
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 + ".." 

這將導致類似C:\Users\michael\Downloads\..\..在Windows和/home/michael/../..在Unix。每個..都返回一步,相當於刪除路徑名組件。

但是你可以通過做分手的路徑更好:

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

和再結合所有,但最後兩位獲得C:\Users在Windows和/在Unix。如果你這樣做,檢查是否有足夠的路徑名組件可以刪除是一個好主意。

請注意,我通過輸入python ../xxx.py來運行上述程序。換句話說,我和腳本不在同一個工作目錄,因此getcwd()不會有用。

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')