python实现windows下的ls函数-用类进行代码重构

结合13日和19日更的《python实现windows下的ls函数》和《python类相关装饰器小记》这两篇文章,对ls函数用类封装进行代码重构,主要是熟悉下类的一些基本概念。ls运行结果如下:


2019-10-20_120639.png

主要的改变有以下几点:

  1. 将argparse解析器以及参数定义函数化为argparse_fun;
  2. 将判断目录是否合法也函数化为path_legal_or_not;
  3. 将path_legal_or_not定义为静态方法,和argparse_fun一起封装入ClassArgparse类中;
  4. LsCommand类中用slot属性插槽(属性插槽是我自己对其的称呼,勿随意效仿哈)将属性列表式存放。

代码直接贴出如下

# -*- encoding=UTF-8 -*-
__author__ = 'wjj1982'
__date__ = '2019/10/13 10:37'
__product__ = 'PyCharm'
__filename__ = 'ls'

import argparse
import os
import time
import prettytable


class ClassArgparse(object):
    # def __init__(self):

    def argparse_fun(self):
        # 定义一个参数解析器
        parser = argparse.ArgumentParser(prog='ls', usage='ls.py [-h -a -s -t -r]',             add_help=True,description='wjj自写win下的ls命令')  
        # 获取参数解析器,默认add_help就是True

        # 给解析器加入位置参数path和选项参数 a和r
        parser.add_argument('path', nargs='?', default='.', help='文件夹路径')  # 增加位置参数path
        parser.add_argument('-a', '--all', action='store_true', help='列出文件夹下的文件')  # 增加选项参数-a
        parser.add_argument('-s', '--sorted', action='store_true', help='列出按文件大小排序后的文件夹下的文件')  # 增加选项参数-s
        parser.add_argument('-t', '--time', action='store_true', help='列出按时间排序后的文件夹下的文件')  # 增加选项参数-t
        parser.add_argument('-r', '--recursion', action='store_true', help='循环列出文件夹下所有文件')  # 增加选项参数-r

        # 用解析器解析命令行输入的参数
        # args = parser.parse_args()  # 分析参数,空表示无参数传入,也可以带参传入,例如:args = parser.parse_args(('-r','-a','.'))
        return parser.parse_args()

    @staticmethod
    def path_legal_or_not(path):
        # 判断路径是否合法
        directory = path
        # 如果指定目录不存在,抛出异常
        if not os.path.exists(directory):
            raise ValueError(f'{directory} does`t exist')  # 等同于 raise ValueError('{} does`t exist'.format(directory))

        # 如果directory不是一个目录,抛出异常
        if not os.path.isdir(directory):
            raise ValueError(f'{directory} is not a directory')


class LsCommand(object):
    __slots__ = ('show_all', 'recursion', 'directory', 'show_sorted_size', 'show_sorted_time')

    def __init__(self, show_all=False, directory='.', recursion=False, show_sorted_size=False, show_sorted_time=False):
        '''
        :param show_all: 是否显示隐藏文件
        :param directory: 指定的文件目录
        :param recursion: 是否递归显示目录下的文件
        '''
        self.show_all = show_all
        self.recursion = recursion
        self.directory = os.path.abspath(directory)
        self.show_sorted_size = show_sorted_size
        self.show_sorted_time = show_sorted_time

    def list_dir(self):
        '''
        处理目录
        :param directory: 文件目录
        :param grade: 目录层级
        :param placeholder: 子目录文件前面的占位符
        :return:
        '''
        # 判断是否为文件夹
        # grade是否增加过了
        # os.listdir: 列出当前文件夹下面的所有文件和文件夹
        # 遍历目录下的文件,文件夹

        list_temp2 = []
        list_temp3 = []
        file_id = 0
        if self.show_all:
            for i in os.listdir(self.directory):
                list_temp1 = []
                list_temp1.append(file_id)
                list_temp1.append(i)
                list_temp1.append(os.path.getsize(self.directory + '\\' + i))
                list_temp1.append(
                    time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(os.stat(self.directory + '\\' + i).st_ctime)))
                file_id += 1

                if os.path.isdir(self.directory + '\\' + i):
                    list_temp2.append(list_temp1)
                else:
                    list_temp3.append(list_temp1)
        elif not self.show_all:
            for i in os.listdir(self.directory):
                list_temp1 = []
                list_temp1.append(file_id)
                list_temp1.append(i)
                list_temp1.append('--')
                list_temp1.append('--')
                file_id += 1

                if os.path.isdir(self.directory + '\\' + i):
                    list_temp2.append(list_temp1)
                else:
                    list_temp3.append(list_temp1)

        return list_temp2, list_temp3

    # 按照文件大小或者按照时间进行排序,返回排序后的文件列表
    def sorted_file(self, list_temp2, list_temp3):
        if self.show_sorted_size:
            list_temp2 = sorted(list_temp2, key=lambda x: x[2])
            list_temp3 = sorted(list_temp3, key=lambda x: x[2])

        if self.show_sorted_time:
            list_temp2 = sorted(list_temp2, key=lambda x: x[3])
            list_temp3 = sorted(list_temp3, key=lambda x: x[3])

        return list_temp2, list_temp3

    # 定义运行主函数
    def run(self):
        '''
        运行ls命令
        :return:
        '''
        list_temp2, list_temp3 = self.list_dir()
        if self.show_sorted_size or self.show_sorted_time:
            list_temp2, list_temp3 = self.sorted_file(list_temp2, list_temp3)

        return list_temp2, list_temp3


def main():
    # args = parser.parse_args()
    arg_class = ClassArgparse()
    args = arg_class.argparse_fun()
    ClassArgparse.path_legal_or_not(args.path)
    # arg_class.path_legal_or_not(args.path)
    # args = argparse_fun()
    # path_legal_or_not(args.path)
    ls = LsCommand(args.all, args.path, args.recursion, args.sorted, args.time)
    table_x = prettytable.PrettyTable(["ID", "目录名", "目录大小", "创建时间"])
    table_x.align['目录名'] = 'l'
    table_y = prettytable.PrettyTable(["ID", "文件名", "文件大小", "创建时间"])
    table_y.align['文件名'] = 'l'
    list_dir_file = ls.run()
    for i in list_dir_file[0]:
        table_x.add_row(i)

    for i in list_dir_file[1]:
        table_y.add_row(i)
    print(table_x)
    print(table_y)


if __name__ == '__main__':
    main()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343