46

会用python把linux命令写一遍的人,进大厂有多容易?

 4 years ago
source link: https://www.tuicool.com/articles/A7jANnb
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

nQzu2y3.png!web

看过这篇《 2000字谏言,给那些想学Python的人,建议收藏后细看! 》的读者应该都对一个命令有点印象吧?没错,就是 linux 中经常会用到的 ls 命令。

文章中我就提到如何提升自己的 python 能力呢?直接找项目写,但是作为零基础 / 小白 / 入门 的你来说做一个博客还要学 web 框架、html、css、js,又成为了阻碍你写实际项目的阻碍。

所以我就推荐了这个命令:ls。写一个 ls 非常简单,你只需要会一点 linux 的基础知识,知道 ls 能做什么就好了。

那今天就给大家码了一个哪哪能用的 ls.py ,没错,windows 也可以哦~

演示环境

  • 操作系统:windows10
  • python版本:python 3.7
  • idea:pycharm 2018.2
  • 使用模块:argparse, os

了解argparse模块

argparse是python的标准库,他可以使我们很友好的编写命令行界面,并且可以自动生成帮助文档和使用消息,还能在参数无效的时候发出错误。

argparse.ArgumentParse类参数理解

%(prog)s

argparse.ArgumentParser.add_argument函数理解

  1. name | flags: 指定参数的名字
  2. action: 指定命令行参数,内置为以下几种

    • store: 默认值,仅仅保存参数值。
    • store_const: 与store基本一致,但是只保存const关键字指定的值,其它的值会报错
    • store_true | store_false: 与store_const基本一致,只保存True和False
    • append: 将相同参数的不同值保存在一个list中
    • count: 统计参数出现的次数
    • help: 输出程序的帮助信息
    • version: 输出程序版本信息
  3. nargs: 将不同数量的值与一个参数关联起来

    • nargs=N:N为整数
    • nargs='?'
    • nargs='*': 将所有的参数保存在列表中
    • nargs='+': 将所有的参数保存在列表中,但是至少得有一个参数
    • nargs=argparse.REMAINDER: 其余的参数全部保存在一个list中
  4. default: 如果没有传入这个参数,默认使用default参数的值
  5. type: 接收到的参数会经过这个参数对应的函数处理。
  6. choices: 将参数指定在一个范围内,超出就报错
  7. required: 指定参数是否为必传参数。
  8. dest: 自定义参数的名称,默认名称为 “- 后面的值” 或者 “-- 后面的值”。

编写ls命令脚本

这里我们就简单的指定三个参数.

  • -a: 添加 -a 参数,显示隐藏文件。
  • -r: 添加 -r 参数,递归显示文件夹下面的文件。
  • -d: 指定显示目录,如果不指定,默认为当前目录。

首先我们使用 ArgumentParser 类来指定参数。

import os
import argparse

parser = argparse.ArgumentParser(prog='ls', description='显示文件夹下的文件')

# 指定参数
parser.add_argument('-a', '--all', const=True, nargs='?', help='是否显示隐藏文件')
parser.add_argument('-d', '--directory', help='指定显示的目录,如果不指定,默认为当前目录')
parser.add_argument('-r', '--recursion', const=True, nargs='?', help='是否递归显示')

# 解析参数
args = parser.parse_args()

# 拿到directory参数,如果没有传这个参数,为None
directory = args.directory
# 如果directory有值
if directory:
    # 如果指定目录不存在,抛出异常
    if not os.path.exists(directory):
        raise ValueError(f'{directory} does`t exist')

    # 如果directory不是一个目录,抛出异常
    if not os.path.isdir(directory):
        raise ValueError(f'{directory} is not a directory')

# 如果directory为None,给directory赋值
else:
    directory = '.'

我们规定好参数之后,接下来就是具体ls的实现。我们封装一个 LsCommand 类

class LsCommand():
    def __init__(self, show_all=False, directory='.', recursion=False):
        '''
        :param show_all: 是否显示隐藏文件
        :param directory: 指定的文件目录
        :param recursion: 是否递归显示目录下的文件
        '''
        self.show_all = show_all
        self.recursion = recursion
        self.directory = os.path.abspath(directory)


    def handle_dir(self, directory, grade=1, placeholder='--'):
        '''
        处理目录
        :param directory: 文件目录
        :param grade: 目录层级
        :param placeholder: 子目录文件前面的占位符
        :return:
        '''
        # 判断是否为文件夹

        # grade是否增加过了

        # os.listdir: 列出当前文件夹下面的所有文件和文件夹
        # 遍历目录下的文件,文件夹
        pass

    def show_file_or_dir(self, file, prefix=''):
        # 如果不显示隐藏文件

        # 打印前缀和文件名
        pass

    def run(self):
        '''
        运行ls命令
        :return:
        '''
        # os.listdir(dir) 得到dir目录下所有文件,文件夹

        # 遍历self.directory目录先所有文件,文件夹

        pass

ls这个类我们也封装好了,接下来我们将得到的参数传入 LsCommand 类中,然后运行,就可以愉快的得出结果。

ls = LsCommand(bool(args.all), directory, bool(args.recursion))
ls.run()

效果展示:

python ls.py

NNnInqN.png!web

python ls.py -a

Q7bAvie.png!web

python ls.py -a -r

IrieQjr.png!web

python ls.py -d ./temp

NBzuquZ.png!web

关注公众号「 Python专栏 」,后台回复「 机器学习电子书 」免费获取100本机器学习电子书


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK