python每日小程序5 用python实现一个shell

原理

在linux中可以使用cd ls touch mkdir等命令快速的对目录和文件进行操作,python标准库中提供了对路径的操作模块,我们可以用它来模拟实现linux终端的部分功能

使用的模块

pathlib

截图

python每日小程序5 用python实现一个shell_第1张图片

代码

函数都写了注释,不明白的可以留言或私聊

from pathlib import *

class myShell(object):
    '''
    实现关于文件有关的操作
    cd ls pwd 
    touch
    mkdir 

    '''
    def __init__(self):
        '''
        初始化实例变量,cur为当前的路径
        '''
        self.cur = Path('.')

    def main(self):
        '''
        用来开启主循环
        '''
        while True:
            self.input_handle()

    def input_handle(self):
        '''
        获得输入,并传入函数处理
        '''
        a = input(f'kalpe:{self.cur.resolve()} >>')
        b = a.split(' ')
        if a == 'ls':
            self._ls()
        if a == 'pwd':
            self._pwd()
        if b[0] == 'cd':
            self._cd(b)
        if b[0] == 'touch':
            self._touch(b)
        if b[0] == 'mkdir':
            self._mkdir(b)

    def _ls(self):
        '''
        显示当前路径下的文件和文件和文件夹
        '''
        for i in self.cur.iterdir():
            print(i)

    def _pwd(self):
        '''
        获得当前的路径
        '''
        self.cur = self.cur.cwd()
        print(self.cur)

    def _cd(self,arg):
        '''
        切换目录
        '''
        if len(arg) != 2:
            tip = '''
            你输入的格式有误,命名格式: 
                cd 路径
            例子:
                cd .
                cd ..
                cd /home
            '''
            print(tip)
            return 0
        #当前目录,即不用切换
        if arg[1] == '.':
            return 1
        #上一层目录
        elif arg[1] == '..':
            self.cur  = self.cur.parent
            return 1
        #指定路径,利用一个临时的a,先检查是否存在,然后替换self.cur
        else:
            a = Path(arg[1])
            if a.exists():
                self.cur = a
            else:
                print('你输入的文件/目录不存在')

    def _touch(self,arg):
        '''
        创建一个文件
        '''
        if len(arg) < 2:
            tip = '''
            你的输入格式有误,命令使用:
                touch filename
            例子:
                touch 1
                touch 1 2 3
            '''
            print(tip)
        for i in arg[1:]:
            a = Path(i)
            try:
                a.touch(mode=0o666,exist_ok=False)
            except FileExistsError:
                b = input(f'文件{i}已存在,是否需要覆盖(y/n):')
                if b == 'y' or b == 'Y':
                    a.touch(mode=0o666,exist_ok=True)
                    print('覆盖完成...')

    def _mkdir(self,arg):
        '''
        创建一个目录,类似创建文件,代码也类似
        '''
        if len(arg) < 2:
            tip = '''
            你的输入格式有误,命令使用:
                mkdir filename
            例子:
                mkdir 1
                mkdir 1 2 3
            '''
            print(tip)
        for i in arg[1:]:
            a = Path(i)
            try:
                a.mkdir(mode=0o777,exist_ok=False)
            except FileExistsError:
                b = input(f'目录{i}已存在,是否需要覆盖(y/n):')
                if b == 'y' or b == 'Y':
                    a.mkdir(mode=0o777,exist_ok=True)
                    print('覆盖完成...')

if __name__ == "__main__":
    a = myShell()
    a.main()

你可能感兴趣的:(每日小程序)