2010-09-21 90 views
2

我有一個文件的結構是這樣的:Python:獲取妹妹目錄中的文件路徑?

data 
    mydata.xls 
scripts 
    myscript.py 

從myscript.py內,我怎麼能得到mydata.xls的文件路徑?

我需要通過它來xlrd:似乎

book = xlrd.open_workbook(filename) 

和相對文件路徑,如」 ../data/mydata.xls'不工作。

+0

你什麼錯誤信息的絕對路徑?你從哪裏開始你的腳本? – eumiro 2010-09-21 09:22:28

回答

5

您可以使用os.path.abspath(<relpath>)從相對路徑獲取絕對路徑。

[email protected]:~/p/f$ more a.py 
import os 
print os.path.abspath('../g/a') 

[email protected]:~/p/f$ python a.py 
/home/vinko/p/g/a 

的目錄結構:

[email protected]:~/p$ tree 
. 
|-- f 
| `-- a.py 
`-- g 
    `-- a 

2 directories, 2 files 
2
import os 
directory = os.path.dirname(os.getcwd()) 
final = os.path.join(directory, 'data', 'mydata.xls') 

或者乾脆

os.path.abspath('../data/mydata.xls') 
3

如果你想嘗試

os.path.join(os.path.dirname(__file__), '../data/mydata.xls') 
以使其獨立於當前目錄

特殊變量__file__包含使用它的腳本的相對路徑。請記住,當使用REPL解釋器時,__file__未定義。

+0

+1對於即使從其他目錄調用腳本也能正常工作的解決方案。 – FMc 2010-09-21 09:35:02

+0

不起作用:產生:IOError:[Errno 2]沒有這樣的文件或目錄:'/my/file/path/load/../data/mydata.xls' – AP257 2010-09-21 09:42:12

+0

@ AP257:錯誤消息中的路徑正確與否?你可以使用'os.path.abspath'將它翻譯成絕對路徑,但這不應該有所作爲。 – 2010-09-21 17:26:06

-1

從您的意見,似乎book = xlrd.open_workbook(filename)不喜歡相對路徑。您可以創建相對於當前文件__file__的路徑,然後採取將刪除相關部分(..

import os 

filename = os.path.join(os.path.dirname(__file__), '../data/mydata.xls') 
book = xlrd.open_workbook(os.path.abspath(filename)) 
+0

-1似乎你不明白「..」相對路徑是相對於*當前工作目錄*而OP需要一個相對於他的*腳本目錄*的路徑;與'xlrd'完全沒有關係。其次'__file__'是*當前正在執行的文件*的路徑,如果OP想要將其代碼放入導入的實用程序模塊中,則無效。 – 2010-09-25 22:59:52

+0

@John我沒有看到我的答案與以前的答案有什麼不同,除了我刪除了路徑「相對」部分。我簡單地混合了溫科和亞當的答案。我的解釋是否給了我一個反對票? OP不會談論相關目錄,而是從他的myscript.py文件中討論。我同意,如果使用__file__在模塊中使用,但OP沒有指定它,則它是沒用的。 – Rod 2010-09-26 00:37:56

+0

其他答案不包括你的愚蠢的第一句話。 xlrd.open_workbook()只是將未修改的文件名傳遞給內置的「open()」 - 「不喜歡相對路徑」是無稽之談。 – 2010-09-26 04:20:29

相關問題