Python學習之旅:使用Python實現Linux中的ls命令

来源:https://www.cnblogs.com/TM0831/archive/2019/09/06/11459109.html
-Advertisement-
Play Games

一、寫在前面 前幾天在微信上看到這樣一篇文章,鏈接為:https://mp.weixin.qq.com/s/rl6Sgv3uk_IpoFAx6cWa8w,在這篇文章中,有這樣一段話,吸引了我的註意: 在 Linux 中 ls 是一個使用頻率非常高的命令了,可選的參數也有很多, 算是一條不得不掌握的命 ...


一、寫在前面

  前幾天在微信上看到這樣一篇文章,鏈接為:https://mp.weixin.qq.com/s/rl6Sgv3uk_IpoFAx6cWa8w,在這篇文章中,有這樣一段話,吸引了我的註意:

  

   在 Linux 中 ls 是一個使用頻率非常高的命令了,可選的參數也有很多, 算是一條不得不掌握的命令。Python 作為一門簡單易學的語言,被很多人認為是不需要認真學的,或者只是隨便調個庫就行了,那可就真是小瞧 Python 了。那這次我就要試著用 Python 來實現一下 Linux 中的 ls 命令, 小小地證明下 Python 的不簡單!

 

二、ls簡介

  Linux ls 命令用於顯示指定工作目錄下的內容。語法如下:

ls [-alkrt] [name]

  這裡只列舉了幾個常用的參數,ls 命令的可選參數還是很多的,可以使用 man ls 來進行查看具體信息。這裡列出的幾個參數對應含義如下:

  1)-a:顯示所有文件及目錄;

  2)-l:除文件名稱外,亦將文件大小、創建時間等信息列出;

  3)-k:將文件大小以 KB 形式表示;

  4)-r:將文件以相反次序排列;

  5)-t:將文件以修改時間次序排列。

 

三、具體思路

  主要使用的模塊是 argparse 和 os,其中 argparse 模塊能設置和接收命令行參數,也就使得 Python 對命令行的操作變得簡單,而 os 模塊則用於文件操作,對 argparse 模塊不熟悉的可以在這裡查看官方文檔。

  既然要用 Python 實現 ls.py, 也就要在命令行中進行操作,比如 python ls.py -a 這樣的命令,而對 Python 比較熟悉的人可能會想到使用 sys 模塊來接收輸入的命令,但使用 argparse 能讓命令行操作變得更加簡單!首先要導入模塊並創建一個 ArgumentParser 對象,可以理解為一個解析器,然後就可以通過使用 add_argument() 方法為這個解析器添加參數了。示例如下:

 1 # test.py
 2 import argparse
 3 
 4 parser = argparse.ArgumentParser(description='Find the maximum number.')
 5 parser.add_argument("integers", type=int, nargs="+", help="The input integers.")
 6 parser.add_argument("-min", nargs="?", required=False, dest="find_num", default=max, const=min, 
 7                     help="Find the minimum number(Default: find the maximum number).")
 8 
 9 
10 args = parser.parse_args()
11 print(args)
12 print(args.find_num(args.Nums))

  這段代碼的功能是輸入一到多個整數,預設求其中的最大值,若有 -min 參數則是求其中的最小值。可以看到在創建解析器和添加命令行參數的時候都設置了 description 描述信息,這個信息會在我們使用 --help 命令的時候顯示出來,例如:

  

  在上面的代碼中,需要註意的是其中使用 add_argument() 添加了一個位置參數 "integers" 和一個可選參數 "-min",位置參數在命令行中必須存在,不可遺漏,也就不能設置 required 參數了,而可選參數就不是必須要有的了,因而還可以使用 default 參數設置預設值。nargs 參數用於設置命令行參數的數量,"+" 表示一個或多個,"?" 表示零個或一個,這裡由於輸入的數字可能有多個,所以要設置為 "+"。最終運行示例如下:

> python test.py 1 3 5

Namespace(find_num=<built-in function max>, integers=[1, 3, 5])
5

> python test.py 1 3 5 -min

Namespace(find_num=<built-in function min>, integers=[1, 3, 5])

1

  關於 argparse 的介紹就到此為止了,下麵簡單介紹下 os 模塊, os 模塊提供了便捷的使用操作系統相關功能的方式,實現 ls.py 所用到的該模塊下的方法包括:

  1)os.path.isdir(path):若 path 是一個存在的目錄,返回 True。

  2)os.listdir(path):返回一個列表,其中包括 path 對應的目錄下的內容,不包含“.”和“..”,即使它們存在。

  3)os.stat(path):獲取文件或文件描述符的狀態,返回一個 stat_result 對象,其中包含了各種狀態信息。

 

四、主要代碼

   ls.py 中的主函數如下,主要功能為創建解析器,設置可選參數和位置參數,然後接收命令行參數信息,並根據輸入的參數調用相應的方法,這裡設置了一個 "-V" 參數用於顯示版本信息,可以使用 "-V" 或者 "-Version" 進行查看。

 1 def main():
 2     """
 3     主函數,設置和接收命令行參數,並根據參數調用相應方法
 4     :return:
 5     """
 6     # 創建解析器
 7     parse = argparse.ArgumentParser(description="Python_ls")
 8     # 可選參數
 9     parse.add_argument("-a", "-all", help="Show all files", action="store_true", required=False)
10     parse.add_argument("-l", "-long", help="View in long format", action="store_true", required=False)
11     parse.add_argument("-k", help="Expressed in bytes", action="store_true", required=False)
12     parse.add_argument("-r", "-reverse", help="In reverse order", action="store_true", required=False)
13     parse.add_argument("-t", help="Sort by modified time", action="store_true", required=False)
14     parse.add_argument("-V", "-Version", help="Get the version", action="store_true", required=False)
15     # 位置參數
16     parse.add_argument("path", type=str, help="The path", nargs="?")
17 
18     # 命令行參數信息
19     data = vars(parse.parse_args())
20     assert type(data) == dict
21     if data["V"]:
22         print("Python_ls version: 1.0")
23         return
24     else:
25         check_arg(data)

   然後是一個獲取指定路徑下的內容信息的函數,要做的就是判斷路徑是否存在,若存在就返回一個文件列表,若不存在則顯示錯誤信息,並退出程式。

 1 def get_all(path):
 2     """
 3     獲取指定路徑下的全部內容
 4     :param path: 路徑
 5     :return:
 6     """
 7     if os.path.isdir(path):
 8         files = [".", ".."] + os.listdir(path)
 9         return files
10     else:
11         print("No such file or directory")
12         exit()

 

五、運行結果

  下麵是 ls.py 運行後的部分結果截圖。

  首先是 python ls.py -a,這裡並沒有輸入路徑,就會使用預設路徑即當前目錄,如下圖:

  

  然後是 python ls.py -a -t .,使用該命令會顯示當前目錄下的所有內容,並按照創建的時間進行排序,如下圖:

  

  最後是 python ls.py -a -l -k -r .,也是顯示當前目錄下的所有內容並按照創建名稱排序,不過這次文件大小會以 KB 為單位來顯示,如下圖:

  

   到這裡為止,ls.py 就算是基本實現了,當然還是有很多可以去實現的功能的,比如更多的參數等等,如果你感興趣的話可以自己嘗試一下==

 

  完整代碼已上傳到GitHub


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 <style type="text/css"> 7 #div1{ 8 width: 200px; 9 ... ...
  • 上一篇我們主要講解了函數的執行過程和原理,本篇我們將介紹函數的另外兩個特殊表現:閉包和立即執行函數。 一 閉包 1, 閉包的形成 之前我們提到,函數執行完畢,馬上就會銷毀自己的AO對象。但是如果遇到下麵這種情況:有子函數的定義,並將子函數返回。它真的就完全銷毀了自己的AO對象嗎? 這將列印什麼呢?表 ...
  • extend是jQuery中一個比較核心的代碼,如果有查看jQuery的源碼的話,就會發現jQuery在多處調用了extend方法。 作用 1. 對任意對象進行擴展 2. 擴展某個實例對象 3. 對jquery本身的實例方法進行擴展 實現 基礎版本, 對簡單對象進行擴展 jQuery.prototy ...
  • 本架構主要目的是改進軟體開發中松耦合、增加模塊的重用性、提高開發效率。 在常規的模塊間方法直接調用式開發中,新增的功能對原有模塊代碼的穩定性、重用性破壞大,不利於軟體的後期維護,且開發效率低。 另外,在傳統的軟體開發方法中,如果新增的功能的邏輯在其它模塊需要重覆使用,則只能通過copy代碼或方法調用 ...
  • 概述 靜態頁面生成是常用的提升性能手段,將一些高併發、變化頻率低、對延遲容忍度高的頁面生為靜態頁面,在電商場景中首頁、商品詳情頁、幫助中心頁、專題頁都是符合特征的頁面。通過生成靜態頁直接輸出給瀏覽器,能夠有效的減少資料庫及cpu的負載。 一般說來,靜態頁的生成和展示有如下幾個裝置: 頁面生成裝置 頁 ...
  • 一、HAProxy概述: HAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速並且可靠的一種解決方案。根據官方數據,其最高極限支持10G的併發。 HAProxy特別適用於那些負載特大的web站點, 這些站點通常又需要會話保持或七層處理。HAProxy運 ...
  • 版權歸作者所有,任何形式轉載請聯繫作者。 作者:tison(來自豆瓣) 來源:https://www.douban.com/note/733279598/ Monad 在實際開發中的應用 不同的人會從不一樣的角度接觸 Monad。大多數網上的教程和介紹都從其嚴格的定義出發,加上幾個玩具示例就當講解完 ...
  • 前面幾篇隨筆中介紹了利用矩陣乘法(特別是應用快速冪運算)解決遞推快速求值、置換和幾何變換等問題的方法。實際上矩陣乘法的應用遠不止這些,下麵通過幾個實例來介紹下矩陣乘法的其它一些典型的應用。 【例1】多少條道。 給定一個有向圖,問從A點恰好走k步(允許重覆經過邊)到達B點的方案數mod p的值。 (1 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...