2017-06-10 52 views
0

我有一個需要數據文件才能工作的python包。 目前我只使用open("<filename>",'r')來讀取數據。我應該如何處理包裝所需的數據?

但是,這取決於當前目錄。我覺得有一些方法可以告訴python在相對於軟件包源的目錄中查找文件,而不是相對於使用該軟件包的文件。

對於JVM語言,有一個「資源」目錄,並且Class.getResource工作得很好。有沒有相當於python的?如果不是,處理這個問題的標準方法是什麼?

回答

2

一個模塊通常有一個__file__屬性,以告知包的來源。例如,對於re

>>> import re 
>>> re.__file__ 
'/usr/lib/python3.5/re.py' 
>>> os.path.dirname(re.__file__) 
'/usr/lib/python3.5' 

flask

>>> import flask 
>>> flask.__file__ 
'/home/foo/.local/lib/python3.5/site-packages/flask/__init__.py' 
>>> os.path.dirname(flask.__file__) 
'/home/foo/.local/lib/python3.5/site-packages/flask' 

然後可以使用os.path.dirname獲取目錄,並使用os.path.join與新的文件名一起加入的路徑。

所以說,你要一個文件加載相對於re包,你可以使用:

import re 
import os 

with open(os.path.join(os.path.dirname(re.__file__),'foo.data'),'r') as f: 
#             ^relative pathname 
    pass 

隨着'foo.data'此文件相對re包文件。

+0

這似乎工作。有一件事,在''../foo.data''中使用正斜槓嚴格正確嗎? path.join似乎使我的Windows機器上的'\\ a \\ b \\ ../ foo.data',它可以處理,但我可以想象其他方式不是很好。 – Lucas

+1

@Lucas:好點。我對Linux有點太習慣了。所以最好安全,不要抱歉。 –

相關問題