2017-05-28 41 views
0

確定一個類型的文件(普通文件,目錄,符號鏈接等),我想一個簡單的方法來確定一個類型的路徑,所以我用Google搜索了很多,然後我寫了這個:簡單的方法通過路徑蟒蛇

from stat import S_ISREG, S_ISDIR, S_ISLNK 
from os import stat, lstat 
from os.path import isfile, islink, isdir, lexists, exists 
from enum import Enum, auto 

class FileTypes(Enum): 
    FILE = auto() 
    LINK_TO_FILE = auto() 
    DIR = auto() 
    LINK_TO_DIR = auto() 
    BROKEN_LINK = auto() 
    NO_SUCH = auto() 
    UNDEFINED = auto() 

def file_type(filename): 
    if lexists(filename): 
     if isfile(filename): 
      if islink(filename): 
       return FileTypes.LINK_TO_FILE 
      else: 
       return FileTypes.FILE 
     else: 
      if isdir(filename): 
       if islink(filename): 
        return FileTypes.LINK_TO_DIR 
       else: 
        return FileTypes.DIR 
      else: 
       if islink(filename): 
        return FileTypes.BROKEN_LINK 
       else: 
        return FileTypes.UNDEFINED 
    else: 
     return FileTypes.NO_SUCH 

然後,我用Google搜索更寫了這樣:

​​

兩個函數做我想做的,但看起來有點醜,我覺得我失去了一些很酷的Python的lib一個簡單的解決方案躲藏。

問題是:有沒有更好的方法來做到這一點?

回答

0

我們可以使它更consise裏面枚舉利用bitmasking:

假設第一值描述文件是否存在:0現有1不存在,第二個是符號鏈接:1表示鏈接,0表示非鏈接,第三表示目錄:如果它是目錄,則爲1;如果不是,則爲0;最後一個用於相同menner的文件。

因此,如果我們想描述existsand是提交一個符號鏈接文件,我們將使用0(exists)1(link)0(non-dir)1(file)

隨着使用有意義的值,我們現在可以consisely鏈條中的人與值從蟒蛇stat包裝返回的結果一起。

class FileTypes(Enum): 
    FILE = 1 #0001 
    LINK_TO_FILE = 5 #0101 
    DIR = 2 #0010 
    LINK_TO_DIR = 6 #0110 
    BROKEN_LINK = 4 #0100 
    NO_SUCH = 0 #1000 
    UNDEFINED = #0000 

def file_type(filepath): 
    return FileTypes.NO_SUCH if lexists(filepath) else 
     Filetypes(int(
      str(int(islink(filepath))) 
      + str(int(isdir(filepath))) 
      + str(int(isfile(filepath))))) 

顯然有一些illegal美國的問題一樣,如果事會報告,它既是目錄和文件,在這一點上,這將引發異常,它可以被修改爲不同的行爲,但提高的例外似乎是非常有效的。

另外我用相當醜陋的方式將這個值加在一起,但這是爲了可讀性。你總是可以做''.join(map(str,map(int,[islink(filepath),isdir(filepath),isfile(filepath)])))甚至更​​短的路線

1

您可以嘗試pathlib模塊,它自Python 3.4以來一直在stdlib中(對於較老的pythons使用pip install pathlib)。它定義了Path類,它包含用於檢查文件類型的方法以及resolving符號鏈接。此外,它提供了一個非常方便的API:

>>> from pathlib import Path 
>>> path = Path("/etc/")/"passwd" 
>>> path 
PosixPath('/etc/passwd') 
>>> path.is_file() 
True