python基礎模塊三劍客:sys、os、shutil

有同學問了個問題:在python裡如何複製、刪除、重命名文件?

有個同學知道os.system(),就回答說:

os.system('cp a.v b.v')、os.system('rm b.v')、os.system('mv a.v b.v')

那如果是windows系統呢?

有個熟悉DOS命令的同學回答說:

os.system('copy a.v b.v')、os.system('del b.v')、os.system('rename a.v b.v')

又有個同學找到一個“通用的”方法說,windows上可以安裝類unix小工具,然後繼續用linux的方法。

其實python已經為我們考慮過系統兼容的問題了。在python的官方網站上有以下的描述:

Runs anywhere, including Mac OS X, Windows, Linux, and Unix, with unofficial builds also available for Android and iOS.

所以,在開始更深入的學習之前,我們有必要先來學一下基本的與操作系統(os)、文件(sys)、shell(shutil)打交道的方式。os, sys, shutil這三個模塊/包是python安裝時自帶的,基本上能覆蓋我們的需求。

python基礎模塊三劍客:sys、os、shutil

研究os、sys、shutil提供了哪些函數

我們先用dir()來看看這三個模塊/包提供了哪些函數,然後挑一些常用的函數介紹下。import os模塊後,用dir(os)來查看os提供了哪些函數,如下(常用的用藍色標出):

python基礎模塊三劍客:sys、os、shutil

python基礎模塊三劍客:sys、os、shutil

sys和shutil就留給同學們自己做實驗了。

把研究結果整理如下

我們把函數名字看起來眼熟的整理如下:
os.name
os.getcwd
os.listdir
os.remove
os.makedirs
os.mkdir
os.rmdir


os.chdir
os.rename
os.system
os.sep
os.linesep
os.environ
os.path.abspath
os.path.dirname
os.path.basename
os.path.isfile
os.path.isdir
os.stat
os.path.split
os.path.join
os.popen
os.path.exists
os.symlink

sys.argv
sys.exit
sys.path
sys.platform
sys.stdin
sys.stdout
sys.stderr

shutil.chown
shutil.copy
shutil.copy2
shutil.copytree
shutil.disk_usage
shutil.errno
shutil.make_archive
shutil.which

只列個函數名字有什麼用?怎麼沒有用法介紹?函數太多,我不想也不太實際為每個函數都寫一段完整的用法說明和使用示例。我還是來介紹下怎麼查幫助文檔吧。

搞懂每個函數的用途和用法

舉個例子,如果你想看看os.getcwd和os.popen的用法,你可以在terminal裡如下操作:

還不懂怎麼辦?

  • python的書
  • 百度、bing、google(如果你在國外、或者你有VPN/VPS)
  • 知乎、博客
  • github上找些開源代碼參考
  • 身邊的同學、同事、朋友
  • 微信群

當然還可以閱讀本號ExASIC的《Python在芯片中的應用》系列文章。

疑難問題辨析

os.mkdir與os.makedirs

mkdir創建單個目錄,而makedirs創建一串目錄,類似shell命令make -p。

os.path.curdir、os.path.abspath、os.path.dirname、os.path.basename

curdir是屬性,不是函數,返回一個字符串‘.’abspath返回完整的路徑。dirname和basename的輸入參數是完整路徑,basename返回文件名,dirname返回文件名前面的路徑。

所以說,dirname和basename並不會判斷文件或路徑是否真實存在,只是對提供的字符串做處理。

os.path.isdir、os.path.isfile、os.path.islink

這幾個函數不只是字符串處理哦,文件或目錄不存在時會報錯。從名字上就可以看出它們的功能,判斷是否是文件、目錄、軟鏈接,返回True和False。

os.path.split、os.path.splitext、os.path.join

split是把目錄和文件分開,splitext是把文件名和後綴名分開,join把目錄、文件用/組合成路徑。

os.path.getsize、os.path.getatime、os.path.getctime、os.path.getmtime

os.path.getsize獲取文件的大小。os.path.getatime最後一次access時間,可以是創建、修改、讀等。os.path.getctime最後一次change時間,可以是修改、改變權限、改變所有者等。os.path.getmtime最後一次modify時間,創建、修改等。文件的更多信息可以通過os.stat()來獲取。

寫個實用的腳本/代碼

比如,我們在仿真時,需要根據testcase名字建立一個仿真目錄。具體事項如下:

  1. 從命令行獲取testcase名
  2. 確認項目根目錄,獲取當前目錄的相對路徑
  3. 用find命令獲取testcase的類別
  4. 如果類別不存在,則新建類別目錄,併產生Makefile
  5. 進入類別目錄裡
  6. 如果testcase目錄不存在,則新建,並創建仿真腳本的軟鏈接和Makefile
  7. 完畢後,打印成功提示

參考腳本:

python基礎模塊三劍客:sys、os、shutil

python基礎模塊三劍客:sys、os、shutil

python基礎模塊三劍客:sys、os、shutil


分享到:


相關文章: