我想獲得path指定文件的UNIX文件類型(看看它是否是一個普通的文件,命名管道,塊設備,...)獲取與Python模塊os UNIX文件類型
我發現在文檔os.stat(path).st_type
,但在Python 3.6中,這似乎不工作。
另一種方法是使用os.DirEntry
對象(例如由os.listdir(path)
),但也有隻方法is_dir()
,is_file()
和is_symlink()
。
任何想法如何做到這一點?
我想獲得path指定文件的UNIX文件類型(看看它是否是一個普通的文件,命名管道,塊設備,...)獲取與Python模塊os UNIX文件類型
我發現在文檔os.stat(path).st_type
,但在Python 3.6中,這似乎不工作。
另一種方法是使用os.DirEntry
對象(例如由os.listdir(path)
),但也有隻方法is_dir()
,is_file()
和is_symlink()
。
任何想法如何做到這一點?
的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的箱),但它是一個不錯的庫
您可以使用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>
我絕對不知道這一個。我剛打開文檔,看起來不錯,謝謝。只是爲了保存其他人的谷歌搜索:https://docs.python.org/3/library/pathlib.html – karlosss
它也可作爲Python 2的可安裝軟件包。我已發佈['ruamel.std.pathlib '](https://pypi.python.org/pypi/ruamel.std.pathlib)在PyPI上,它有一些'Path'擴展和一個可以協助轉換的「PathLibConversionHelper」類。 – Anthon