工作當我運行下面的腳本:相對路徑
c:\Program Files\foo\bar\scripy.py
我怎麼能參考目錄'foo'
?
有沒有一種使用相對路徑的方便方法?
我以前用字符串模塊做過,但必須有更好的方法(我找不到它在os.path
)。
工作當我運行下面的腳本:相對路徑
c:\Program Files\foo\bar\scripy.py
我怎麼能參考目錄'foo'
?
有沒有一種使用相對路徑的方便方法?
我以前用字符串模塊做過,但必須有更好的方法(我找不到它在os.path
)。
os.path.dirname(path)
將返回執行SPLIT下半年在路徑參數上。 (頭 - 目錄和尾部,文件)簡單地說,它返回路徑所在的目錄。你需要做兩次,但這可能是最好的方法。
Python文檔上path
功能:
謝謝(全部),完美的工作。 – Dominik
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(), ".."))
這是有點複雜。例如,下面的代碼:
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()不會有用。
我最近開始使用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')
三片歡呼聲! – cledoux