整合 Python标准库之 Path/File 类

原由

os/os.path/shutil 中的一些接口,常常让我迷惑,一会在这个库中,一会在那个库,有时候貌似同一个功能有好几个接口,好比 copy/copyfile/copyfileobj;remove file 的接口貌似在 os 中, remove dir 的接口又在 shutil 中,常常让人傻傻分不清楚。bash

再加上年纪越大,记性能力就呈现出一种可感知的衰减,越记东西就越记不住,反复记忆也没用,难免让人感到哀伤。性能

使用 Java 貌似就没有这么多纠结,接口都很符合直觉,几乎没有记忆过API,每次都是 IDE 自动补全(用到比较少的接口,根据 IDE 的弹窗也能临时选对,不用深刻源码或文档)。ui

把这些杂七杂八的接口再作一层简单包装,就是一种很天然的动力,本文着眼于此,致力于减小这种心智负担,尽量对上提供一致的 API 。spa

包装

这几个标准库的文档很好懂,并无什么值得讨论的地方(惋惜就是老记不住 :)),参照 Java 中对应类的API,咱们的包装工做也是易如反掌。设计

以下:code

import os
import shutil


class Path:
    def __init__(self, pathstr: str):
        self._pathstr = pathstr
        self._abspath = os.path.abspath(pathstr)

    def get_parent(self):
        return Path(os.path.dirname(self._abspath))

    def get_childs(self):
        return [Path(c)
                for c in os.listdir(self._abspath)]

    def is_absolute(self):
        return os.path.isabs(self._pathstr)

    def is_dir(self):
        return os.path.isdir(self._abspath)

    def is_file(self):
        return os.path.isfile(self._abspath)

    def join(self, s):
        return Path(os.path.join(self._abspath, s))

    def get_basename(self):
        return os.path.basename(self._abspath)

    def get_extension(self):
        return os.path.splitext(self._abspath)[1]

    def get_filename(self):
        return os.path.split(self._abspath)[1]

    def is_exists(self):
        return os.path.exists(self._abspath)

    def ends_with(self, ext):
        return self._abspath.endswith(ext)

    def touch(self):
        if self.is_exists():
            return True

        open(self._abspath, mode='r', encoding='utf-8').close()

        return True

    def mkdir(self):
        if self.is_exists():
            return

        os.makedirs(self._abspath)

        return True

    def rm(self):
        if not self.is_exists():
            return

        if self.is_file():
            os.remove(self._abspath)
        if self.is_dir():
            shutil.rmtree(self._abspath)

    def mv(self, dest):
        shutil.move(self._abspath, dest)

    def cp(self, dest):
        if self.is_file():
            shutil.copyfile(self._abspath, dest)

        if self.is_dir():
            shutil.copytree(self._abspath, dest)


class File:
    def __init__(self, filestr: str):
        if not os.path.isfile(filestr):
            raise ValueError('must be a real file, now is %s' % filestr)

        self._filestr = os.path.abspath(filestr)
        self._statresult = os.stat(self._filestr)

    def get_size(self):
        return self._statresult.st_size

    def get_create_time(self):
        return self._statresult.st_ctime
复制代码

使用以下:接口

Path('/root/newfile').touch()
Path('/root/newdir').mkdir()
复制代码

不妨将其放到项目的 utils/ 下面,这样就不再用记忆那一堆乱糟糟的 API 了。:)utf-8

好处

其实,Python 标准库的不少 API,直接使用时,老是须要临时查查文档,或是反复记忆,使用频率很高也都要查阅文档(感受是 API设计不佳),难免让人小烦恼。这个时候,作一层简单的包装或转发,能够马上减小这种痛苦rem

相关文章
相关标签/搜索