2017-06-16 4 views
3

pathで指定されたファイルのUNIXファイルタイプを取得したいと思います(普通のファイルであるか、名前付きパイプであるか、ブロックデバイスであるかを確認してください...)Pythonのosモジュールでunixファイルタイプを取得する

ドキュメントos.stat(path).st_typeにありますが、Python 3.6ではこれが機能していないようです。

別のアプローチは、(os.listdir(path)によって。例えば)os.DirEntryオブジェクトを使用することであるが、唯一の方法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

私は絶対にこれについて知りませんでした。私はドキュメントを開いたばかりだし、うれしいよ、ありがとう。ほかの人のためのGoogle検索を保存するだけです: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> 
関連する問題