2017-06-16 15 views
3

我想獲得path指定文件的UNIX文件類型(看看它是否是一個普通的文件,命名管道,塊設備,...)獲取與Python模塊os UNIX文件類型

我發現在文檔os.stat(path).st_type,但在Python 3.6中,這似乎不工作。

另一種方法是使用os.DirEntry對象(例如由os.listdir(path)),但也有隻方法is_dir()is_file()is_symlink()

任何想法如何做到這一點?

回答

1

的Python 3.6擁有pathlib及其Path對象有方法:

  • is_dir()
  • is_file()
  • is_symlink()
  • is_socket()
  • is_fifo()
  • is_block_device()
  • is_char_device()

pathlib需要一點習慣(至少對於從在Unix C/C++具有來Python的箱),但它是一個不錯的庫

+1

我絕對不知道這一個。我剛打開文檔,看起來不錯,謝謝。只是爲了保存其他人的谷歌搜索:https://docs.python.org/3/library/pathlib.html – karlosss

+1

它也可作爲Python 2的可安裝軟件包。我已發佈['ruamel.std.pathlib '](https://pypi.python.org/pypi/ruamel.std.pathlib)在PyPI上,它有一些'Path'擴展和一個可以協助轉換的「PathLibConversionHelper」類。 – Anthon

2

您可以使用stat模塊來解釋os.stat(path).st_mode的結果。

>>> import os 
>>> import stat 
>>> stat.S_ISDIR(os.stat('/dev/null').st_mode) 
False 
>>> stat.S_ISCHR(os.stat('/dev/null').st_mode) 
True 

您可以使一般函數返回確定的類型。這既適用於Python 2和3

import enum 
import os 
import stat 

class PathType(enum.Enum): 
    dir = 0 # directory 
    chr = 1 # character special device file 
    blk = 2 # block special device file 
    reg = 3 # regular file 
    fifo = 4 # FIFO (named pipe) 
    lnk = 5 # symbolic link 
    sock = 6 # socket 
    door = 7 # door (Py 3.4+) 
    port = 8 # event port (Py 3.4+) 
    wht = 9 # whiteout (Py 3.4+) 

    unknown = 10 

    @classmethod 
    def get(cls, path): 
     if not isinstance(path, int): 
      path = os.stat(path).st_mode 
     for path_type in cls: 
      method = getattr(stat, 'S_IS' + path_type.name.upper()) 
      if method and method(path): 
       return path_type 
     return cls.unknown 

PathType.__new__ = (lambda cls, path: cls.get(path)) 
>>> PathType('/dev/null') 
<PathType.chr: 1> 
>>> PathType('/home') 
<PathType.dir: 0>