zoukankan      html  css  js  c++  java
  • python模拟ls命令

    ##########################列出一个目录###########################
    from pathlib import Path    # “pathlib是一个从3版本开始就能完全替代os.path的内置库 方法:https://www.cnblogs.com/P--K/p/8400379.html
    import argparse # 此模块为3.3以后版本,对传进来的参数argparse帮助解析,https://www.cnblogs.com/shmily2018/p/11592448.html
    from datetime import datetime # 重新封装了time模块,提供更多接口
    # def showls (path:Path):   # (path:path)参数的注解,告诉参数什么类型,开发环境通过读取你设定的开发环境的类型,在paht.的时候给你提供一些帮助
    #    path.
    
    def showdir (path='.',all=False,detail=False,human=False):
        p = Path(path) # 返回的是一个路径,类型linux是<class 'pathlib.PosixPath'>,windows是<class 'pathlib.WindowsPath'>,不能直接打印出来,需要使用for遍历赋值打印出来
        for i in p.iterdir(): # 返回一个迭代器,包含p下的所有文件,包括以点开头的隐藏文件
            if not all and i.name.startswith('.'): # 短路语法,真真为真,startswith检查字符串是否是以指定字符串开头,返回True或者False
                continue  # 跳过以点开头的文件
            if not detail:
                yield (i.name,)
            else:
                stat = i.stat()
            mode = _getfiletype(i) + _getmodestr(stat.st_mode)
            atime =datetime.fromtimestamp(stat.st_atime).strftime('%Y %m %d %H:%M:%S')
            yield (mode,stat.st_nlink,stat.st_uid,stat.st_gid,stat.st_size,atime,i.name)  # 此列表,yield返回成一个生成器,name获取文件名
    
    def _getfiletype(f:Path):
        if f.is_dir():
            return "d"
        elif f.is_block_device():
            return "b"
        elif f.is_char_device():
            return "c"
        elif f.is_socket():
            return "s"
        elif f.is_symlink():
            return "l"
        else:
            return "-"
    
    modlist = dict(zip(range(9),['r','w','x','r','w','x','r','w','x']))
    def _getmodestr(mode:int):
        m = mode & Oo777
        mstr = ''
        for i in range(8,-1,-1):
            if m >> i & 1:
                mstr += modlist[8-i]
            else:
                mstr += '-'
        return mstr
    
    
    parser = argparse.ArgumentParser(prog="ls",add_help=False,description='list all files') # 构建解析器,prog="ls"重命名,add_help=False,是否加-h帮助,,descriptionb 描述
    # 告诉解析器未来你有多少参数
    parser.add_argument("path",nargs="?",default=".",help="path help")  # 位置参数,nargs='*'表示参数可设置零个或多个,nargs=' '+'表示参数可设置一个或多个,nargs="?"参数可有可无,default="."默认参数,help,帮助
    parser.add_argument("-l",action='store_true') # action='store_true' 可有可无后面无参数
    parser.add_argument("-h",action='store_true') # action='store_true' 可有可无后面无参数,-h 与默认选项会冲突add_help=True改为False,否者会报错提示冲突
    parser.add_argument("-a","--all",action='store_true') # action='store_true' 可有可无后面无参数
    
    
    if __name__ == "__main__":  # 文档在运行前变量函数名__name__,一旦此文件运行就就为__main__,用来判断此文件是否运行,执行以下代码
        args = parser.parse_args(("/root",))  # 参数必须是可迭代对象,比如元组,字符串需要使用.split()通过指定分隔符对字符串进行切片,这里使用空格
        parser.print_help()
        print('args =',args)
        print(args.path,args.l,args.h,args.all)
    
    for x in showdir(args.path):
        print(x)
    

    
    from pathlib import Path
    import argparse
    from datetime import datetime
    
    def showdir (path:str='.',all=False,detail=False,human=False):
        p = Path(path)
        # print(type(p))
        for file in p.iterdir():
            if not all and file.name.startswith('.'):
                continue
            elif not detail:
                yield file.name
            st = file.stat()
            # print(st)
            yield (filetype(file)+mode(st.st_mode) ,st.st_ino,st.st_dev,st.st_nlink,st.st_uid,st.st_gid,st.st_size,datetime.fromtimestamp(st.st_atime).strftime('%Y-%m-%d %H:%M:%S'),st.st_mtime,st.st_ctime,file.name)
    
    def filetype (file:Path):
        ret = ""
        if file.is_file():
            ret = 'f'
        elif file.is_block_device():
            ret = 'b'
        elif file.is_socket():
            ret = 's'
        elif file.is_dir():
            ret = 'd'
        elif file.is_symlink():
            ret = 'l'
        elif file.is_char_device():
            ret = 'c'
        else:
            ret = '-'
        return ret
    
    def mode (mode:int):
        modelist = ['r','w','x','r','w','x','r','w','x',]
        modstr = bin(mode)[-9:]
        ret = ''
        # print(list(enumerate(modstr)))
        for i,c in enumerate(modstr):
            # print(i)
            # print('上面是i')
            # print('下面是')
            # print(c)
            if c == '1':
                ret += modelist[i]
            else:
                ret += '-'
        return ret
    
    # mode(33188)
    
    a = argparse.ArgumentParser(prog='ls',add_help=False,description="ls show")
    a.add_argument('path',nargs='?',default='.',help="list paht")
    a.add_argument('-l',action='store_true')
    a.add_argument('-h',action='store_true')
    a.add_argument('-a','--all',action='store_true')
    
    if __name__=='__main__':
        # showdir('/root')
        b = a.parse_args(('/etc',))
        a.print_help()
        print(b.path)
    
    
        for x in showdir(b.path):
            print(x)
    
  • 相关阅读:
    P4178 Tree
    CF437D The Child and Zoo
    CF1032G Chattering ST表+倍增
    P4165 [SCOI2007]组队 推柿子+差分
    P1450 [HAOI2008]硬币购物 容斥原理+完全背包
    P6275 [USACO20OPEN]Sprinklers 2: Return of the Alfalfa P 轮廓线DP
    P6009 [USACO20JAN]Non-Decreasing Subsequences P 矩阵优化DP
    P2605 [ZJOI2010]基站选址 线段树优化DP
    P5597 【XR-4】复读 思维题 +二叉树合并
    P5304 [GXOI/GZOI2019]旅行者 最短路+位运算优化
  • 原文地址:https://www.cnblogs.com/hao-ran/p/12371509.html
Copyright © 2011-2022 走看看