1. 程式人生 > >linux下python的檔案路徑操作

linux下python的檔案路徑操作

如何在linux下通過import來匯入自定義的模組

  • 1.首先執行python,輸入以下命令來獲取系統中Python的預設路徑:
   import sys
   sys.path 
比如,其中一個路徑是:/usr/local/python/lib/python2.7/site-packages/
這時可以把自己編寫的工程放入到該目錄下。比如我編寫了一個基於知網來計算詞語相似度的程式,所有的模組都放在包wordSimilarity中。
/usr/local/python/lib/python2.7/site-packages/wordSimilarity/
_init_.py
primitive.py
word.py
wordsimilarity.py
WHOLE.DAT
glossary.dat

注意,資料夾中wordSimilarity必須包含_ init _.py檔案,這時候才是python包,否則知識一般的資料夾,是不可以import匯入的。

  • 2.在/usr/local/python/lib/python2.7/site-packages/目錄下建立**(隨便名字).pth檔案,在該檔案中輸入wordSimilarity包的絕對路徑,/usr/local/python/lib/python2.7/site-packages/wordSimilarity/,儲存。
  • 3.此時,就可以Import我們自定義的模組了。
import wordSimilarity as ws
from wordSimilarity import
wordsimilarity ...

關於os.path的使用

在上面提到的利用知網來計算詞語相似度的程式,因為需要從檔案(即上面的WHOLE.DAT和glossary.dat或者.txt檔案)中讀入詞條,所以需要把包含詞條的檔案隨模組放在一起才能被正確呼叫。之前都是用全路徑來呼叫,是在太愚蠢了。
先上程式碼(獲取glossary.dat檔案):

"""這方法是看了jieba分詞的原始碼才知道的,非常感謝~~"""
_get_module_path = lambda path: os.path.normpath(os.path.join(
os.path.dirname(__file__), path))
path = _get_module_path("glossary.dat"
)

結巴分詞的原始碼是這樣的:

_get_module_path = lambda path: os.path.normpath(os.path.join(os.getcwd(),
                                                 os.path.dirname(__file__), path))
DEFAULT_IDF = _get_module_path("idf.txt")

但是我的理解是:這個os.getcwd()似乎是多餘的,因為os.getcwd()獲取的是當前執行命令的所在路徑,假設當前路徑不是在/usr/local/python/lib/python2.7/site-packages/wordSimilarity/,都是沒用的。
下面介紹一下os.path的常用方法來解釋一下為什麼:

import os

# 獲取目前執行程式所在的絕對路徑
os.path.getcwd()

# 返回路徑名path的規範化的絕對路徑。在大多數平臺,這等同於這樣
# normpath(join(os.getcwd(), path))呼叫normpath()函式
os.parh.abspath(path)

# 返回路徑名為path的目錄名
os.path.dirname(path)
os.path.dirname(__file__) # __file__返回所呼叫的模組的絕對路徑

# 將一個或多個路徑正確地連線起來。如果任何一個引數是絕對路徑,那之前的引數就會被丟棄,然後連線繼續
os.path.join(path1[, path2[, ...]])

最主要的是:print os.path.dirname(_file_)
一般來說,.py檔案中所要讀寫的檔案,最好是和.py檔案放在同一個層中,這樣會更加方便。

後記

詞語相似度的程式碼基本完成了,但是還需要繼續優化。呼叫方式如下:

import wordsimilarity as ws

word1 = "打架"
word2 = "戰鬥"
# 計算兩個詞語的相似度
sim = ws.simWordStr(word1, word2)
...