python中ls是什么_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是,windows是,不能直接打印出来,需要使用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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值