2015-09-07 343 views
3

os.path.sep是操作系統用來分隔路徑名組件的字符。如何/在哪裏使用os.path.sep?

但是當在os.path.join()中使用os.path.sep時,它爲什麼會截斷路徑?

例子:

相反的'home/python'os.path.join回報'/python'

>>> import os 
>>> os.path.join('home', os.path.sep, 'python') 
'/python' 

我知道os.path.join()插入目錄分隔含蓄。

os.path.sep在哪裏有用?爲什麼它會截斷路徑?

回答

3

os.path.sep在哪裏有用?

我懷疑它的存在主要是因爲模塊需要這樣的變量(爲了避免硬編碼),並且如果它存在的話,它可能會被記錄下來。它的文檔說明它是"occasionally useful"

爲什麼它會截斷路徑?

docs for os.path.join()

如果組件是一個絕對路徑,所有前面的組件被丟棄,並加入從絕對路徑部分繼續。

/是* nix系統上的絕對路徑。

0

os.path.join()調用中刪除os.path.sep。內部使用os.path.sep

在您的系統上,os.path.sep == '/'被解釋爲根目錄(絕對路徑),因此os.path.join('home', '/', 'python')等效於os.path.join('/', 'python') == '/python'From the docs

如果組件是一個絕對路徑,所有前面的組件被拋出 路程,從加盟的絕對路徑部分繼續。

0

作爲正確的os.path.join文檔字符串給出 -

加入兩個或更多個路徑的部件, '/' 根據需要插入。 如果任何組件是絕對路徑,則所有先前的路徑組件都將被丟棄。

同樣給出在docs以及 -

os.path.join(路徑,*路徑)

加入一個或多個路徑成分智能。返回值是路徑和任何*路徑成員的連接,每個除非最後一個非空部分後面都有一個目錄分隔符(os.sep),這意味着如果最後一部分爲空,結果將僅以分隔符結尾。 如果某個組件是絕對路徑,則所有先前的組件都將被丟棄,並且從絕對路徑組件繼續連接。

當你給os.path.sep孤獨,它被認爲是到根目錄的絕對路徑 - /

請注意,這是基於Unix/Linux的os.path,內部是posixpath。儘管在windows os.path.join()中可以看到相同的行爲。

實施例 -

>>> import os.path 
>>> os.path.join.__doc__ 
"Join two or more pathname components, inserting '/' as needed.\n If any component is an absolute path, all previous path components\n will be discarded." 
0

這裏是如果您是POSIX機上所運行的代碼片斷:

posixpath.py

# Join pathnames. 
# Ignore the previous parts if a part is absolute. 
# Insert a '/' unless the first part is empty or already ends in '/'. 

def join(a, *p): 
    """Join two or more pathname components, inserting '/' as needed. 
    If any component is an absolute path, all previous path components 
    will be discarded. An empty last part will result in a path that 
    ends with a separator.""" 
    sep = _get_sep(a) 
    path = a 
    try: 
     if not p: 
      path[:0] + sep #23780: Ensure compatible data type even if p is null. 
     for b in p: 
      if b.startswith(sep): 
       path = b 
      elif not path or path.endswith(sep): 
       path += b 
      else: 
       path += sep + b 
    except (TypeError, AttributeError, BytesWarning): 
     genericpath._check_arg_types('join', a, *p) 
     raise 
    return path 

具體而言,行:

 if b.startswith(sep): 
      path = b 

而且,由於os.path.sep明確以此字符開始,所以無論何時我們遇到它,我們都會丟棄已構建的變量path的部分,並用p中的下一個元素重新開始。

0

但是,當在os.path.join()中使用os.path.sep時,爲什麼會截斷路徑?

os.path.join

的文檔直接引用如果組件是一個絕對路徑,所有以前的組件被丟棄並接合從絕對路徑部分繼續。

所以,當你這樣做:

os.path.join('home', os.path.sep, 'python') 

os.path.sep回報'/'這是一個絕對路徑,所以'home'被扔掉你只有'/python'作爲輸出。

這罐也是明確從例如:

>>> import os 
>>> os.path.join('home','/python','kivy') 
'/python/kivy' 

哪裏os.path.sep是有用的?

os.path.sepos.sep返回操作系統用來分隔路徑名組件的字符。 但再次從docs報價:

注意,知道這是不是足以能夠解析或連接路徑名 - 使用os.path.split這樣的()和os.path.join() - 但它是偶爾有用。