专栏首页极客猴如何利用Python学习linux命令?

如何利用Python学习linux命令?

看过这篇《2000字谏言,给那些想学Python的人,建议收藏后细看!》(http://mp.weixin.qq.com/s?__biz=Mzg4ODE1MjU4Ng==&mid=2247486937&idx=2&sn=ce57ba4a90692f8afadd7547b86c7875&chksm=cffe3abcf889b3aae965421ff0b709e22b4779205e85b75279f7d3221d5a18f3864477798926&scene=21#wechat_redirect)的读者应该都对一个命令有点印象吧?没错,就是 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类参数理解

1. prog:改变应用的名字,我们可以使用`%(prog)s`引用应用的名字,默认的应用名字为文件名。

2. usage: 显示这个命令用法, 一般用来显示参数的用法

3. description:显示这个命令的帮助信息

4. epilog: 显示命令的帮助信息,位置在参数的下面

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

python ls.py -a

python ls.py -a -r

python ls.py -d ./temp

—END—

本文分享自微信公众号 - 极客猴(Geek_monkey)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 微软也爱 Python!VS Code Python 全新发布!

    北京时间 2019 年 10 月 9 日,微软发布了全新的 VS Code Python 插件,带来了众多更新!其中,最大的更新就要属万众期待的 Jupyter...

    猴哥yuri
  • 该如何学习 Python?

    在我的 QQ 学习交流群中,有位读者问我一个很有代表性的问题,在这里和大家分享下。

    猴哥yuri
  • 与 FireBase 亲密接触

    正常的 App 都是属于网络应用,数据都是从服务器上获取的。这就需要有专业的后台开发人员开发后台业务服务器,然后为我们 App 提供数据。自从云出现之后,各大云...

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

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

    机器视觉CV
  • 会用python把linux命令写一遍的人,进大厂有多容易?

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

    小小詹同学
  • electron开发pdf合并工具(二)

    之前我们做了一个简单的界面,但其实并没有什么功能,今天我们基于前段时间一直在学习的vue相关知识,来实现一些后台逻辑。

    efonfighting
  • cibersoft使用SVM算法实现去卷积

    因为表达矩阵通常是bulk转录组测序,也就是说本来就是肿瘤细胞以及其肿瘤微环境的各种其他细胞组合而成,同理我们应该是可以根据表达量推断出来他们的细胞组分,当然,...

    生信技能树
  • SQL优化之一则MySQL中的DELETE、UPDATE 子查询的锁机制失效案例

    开发与维护人员避免不了与 in/exists、not in/not exists 子查询打交道,接触过的人可能知道 in/exists、not in/not e...

    数据和云
  • 漫画趣解Linux内核

    当然,同样辛勤劳动的还有这位小老弟,cron进程。看它急得头上都冒汗了,这位老弟不断的看着手表,执行着周期性任务。

    Linux阅码场
  • 【一天一道Leetcode】丑数Ⅱ

    我们可以根据丑数的性质,只包含2,3,5三个质因数。我们可以分别设置三个指针用来计算丑数。

    潘永斌

扫码关注云+社区

领取腾讯云代金券