看過這篇《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:改變應用的名字,我們可以使用
%(prog)s
引用應用的名字,默認的應用名字為文件名。 - usage: 顯示這個命令用法, 一般用來顯示參數的用法
- description:顯示這個命令的幫助信息
- epilog: 顯示命令的幫助信息,位置在參數的下面
argparse.ArgumentParser.add_argument函數理解
- name | flags: 指定參數的名字
-
action: 指定命令行參數,內置為以下幾種
- store: 默認值,僅僅保存參數值。
- store_const: 與store基本一致,但是只保存const關鍵字指定的值,其它的值會報錯
- store_true | store_false: 與store_const基本一致,只保存True和False
- append: 將相同參數的不同值保存在一個list中
- count: 統計參數出現的次數
- help: 輸出程序的幫助信息
- version: 輸出程序版本信息
-
nargs: 將不同數量的值與一個參數關聯起來
- nargs=N:N為整數
- nargs='?'
- nargs='*': 將所有的參數保存在列表中
- nargs='+': 將所有的參數保存在列表中,但是至少得有一個參數
- nargs=argparse.REMAINDER: 其余的參數全部保存在一個list中
- default: 如果沒有傳入這個參數,默認使用default參數的值
- type: 接收到的參數會經過這個參數對應的函數處理。
- choices: 將參數指定在一個范圍內,超出就報錯
- required: 指定參數是否為必傳參數。
- 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
關注公眾號「 Python專欄 」,后臺回復「 機器學習電子書 」免費獲取100本機器學習電子書
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
