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)
原文地址:https://www.cnblogs.com/hao-ran/p/12371509.html