实现 ls功能
python环境 3.8.10
import argparse
from pathlib import Path
from datetime import datetime
import stat
parser = argparse.ArgumentParser(prog='ls' , add_help=False , description='help dir or cer ')
parser.add_argument('path',nargs='?',help='print path',default='.' )
parser.add_argument('-a','--all',action='store_true',dest='all',help='print all ')
parser.add_argument('-l','--list',action='store_true',dest='long',help='print list' )
parser.add_argument('-h','--human-readable',action='store_true',dest='human',help='--human-readable')
parser.add_argument('-r','--reverse',action='store_true',dest='reverse',help='reverse list')
args = parser.parse_args()
print (args)
parser.print_help()
#业务代码 首先需要想 -l 查看目录文件 联想到path
# def listdir(path,all=False):
# p = Path(path)
# # for f in p.iterdir(): #序列化,将路径下的文件变成一个可迭代对象
# # if not all and f.name.startswith('.'): #判断
# # continue
# # yield f.name
# #yield from filter(lambda f:not(not all and f.name.startswith('.')),p.iterdir()) #将以上for进行改造成yield
# #yield from filter (lambda f : all or not f.name.startswith('.'),p.iterdir()) #
# yield from map(lambda x:x.name,filter(lambda f:all or not f.name.startswith('.'),p.iterdir()))
# #分析以上代码 map 传入一个函数和可迭代对象,返回列表,将filter过滤隐藏文件后的本地文件名传入,返回x.name然后通过yield进行返回
# #通过lamdba 进行过滤 p.iterdir 这是将路径进行序列化然后过滤到.开头的文件,返回非.开头的文件
#-a 的实现
def _listdir(path , all,detail,reverse,human):
"""列出详细的文件rwx"""
p = Path(path)
for i in p.iterdir():
if not all and i.name.startswith('.'):
continue #继续的意思
if not detail :
yield (i.name,)
else :
st = i.stat()
mode = stat.filemode(st.st_mode)
mtime = datetime.fromtimestamp(st.st_mtime).strftime('%y %m %d' '%H' '%M' '%S')
size = st.st_size if not human else _gethuman(st.st_size)
yield (mode,st.st_nlink,st.st_uid,st.st_gid,size,mtime,i.name)
# -r的实现,查看文件排序
def listdir(path , all=False,detail=False,reverse=False,human=False):
"""列出详细的文件rwx"""
return sorted(_listdir(path,all,detail,reverse,human),key=lambda x:x[len(x)-1],reverse=reverse)
#-h 的实现
def _gethuman(size= int):
units = 'KMGTP'
depth = 0
while size > 1000 and depth < len(units) -1:
depth += 1
size //= 1000
return "{}{}".format(size,units[depth] if depth else ' ')
if __name__ == '__main__':
args = parser.parse_args()
print (args)
parser.print_help()
files = listdir(args.path,args.all,args.long,args.reverse,args.human)
print (*files,sep='\n')
基本都是一些常用基本模块+堆命令,自己的水平也不高就写着玩