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

2021-02-21 ExASIC

前面,我們學習了python模塊的基本概念、如何安裝第三方模塊,並學習了寫自己的模塊和包。可以點這裡回顧一下:

Python的模塊介紹及安裝(離線、非管理員)

如何自己寫的模塊和包

有同學問了個問題:在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安裝時自帶的,基本上能覆蓋我們的需求。

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

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

>>> import os
>>> dir(os)

[..., 'abc', 'abort', 'access', 'altsep', 'chdir', 'chmod', 'chown', 'chroot', 'close', 'closerange', 'confstr', 'confstr_names', 'cpu_count', 'ctermid', 'curdir', 'defpath', 'device_encoding', 'devnull', 'dup', 'dup2', 'environ', 'environb', 'errno', 'error', 'execl', 'execle', 'execlp', 'execlpe', 'execv', 'execve', 'execvp', 'execvpe', 'extsep', 'fchdir', 'fchmod', 'fchown', 'fdatasync', 'fdopen', 'fork', 'forkpty', 'fpathconf', 'fsdecode', 'fsencode', 'fspath', 'fstat', 'fstatvfs', 'fsync', 'ftruncate', 'fwalk', 'get_blocking', 'get_exec_path', 'get_inheritable', 'get_terminal_size', 'getcwd', 'getcwdb', 'getegid', 'getenv', 'getenvb', 'geteuid', 'getgid', 'getgrouplist', 'getgroups', 'getloadavg', 'getlogin', 'getpgid', 'getpgrp', 'getpid', 'getppid', 'getpriority', 'getresgid', 'getresuid', 'getsid', 'getuid', 'getxattr', 'initgroups', 'isatty', 'kill', 'killpg', 'lchown', 'linesep', 'link', 'listdir', 'listxattr', 'lockf', 'lseek', 'lstat', 'major', 'makedev', 'makedirs', 'minor', 'mkdir', 'mkfifo', 'mknod', 'name', 'nice', 'open', 'openpty', 'pardir', 'path', 'pathconf', 'pathconf_names', 'pathsep', 'pipe', 'pipe2', 'popen', 'posix_fadvise', 'posix_fallocate', 'pread', 'putenv', 'pwrite', 'read', 'readlink', 'readv', 'remove', 'removedirs', 'removexattr', 'rename', 'renames', 'replace', 'rmdir', 'scandir', 'sched_get_priority_max', 'sched_get_priority_min', 'sched_getaffinity', 'sched_getparam', 'sched_getscheduler', 'sched_param', 'sched_rr_get_interval', 'sched_setaffinity', 'sched_setparam', 'sched_setscheduler', 'sched_yield', 'sendfile', 'sep', 'set_blocking', 'set_inheritable', 'setegid', 'seteuid', 'setgid', 'setgroups', 'setpgid', 'setpgrp', 'setpriority', 'setregid', 'setresgid', 'setresuid', 'setreuid', 'setsid', 'setuid', 'setxattr', 'spawnl', 'spawnle', 'spawnlp', 'spawnlpe', 'spawnv', 'spawnve', 'spawnvp', 'spawnvpe', 'st', 'stat', 'stat_float_times', 'stat_result', 'statvfs', 'statvfs_result', 'strerror', 'supports_bytes_environ', 'supports_dir_fd', 'supports_effective_ids', 'supports_fd', 'supports_follow_symlinks', 'symlink', 'sync', 'sys', 'sysconf', 'sysconf_names', 'system', 'tcgetpgrp', 'tcsetpgrp', 'terminal_size', 'times', 'times_result', 'truncate', 'ttyname', 'umask', 'uname', 'uname_result', 'unlink', 'unsetenv', 'urandom', 'utime', 'wait', 'wait3', 'wait4', 'waitid', 'waitid_result', 'waitpid', 'walk', 'write', 'writev']

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裡如下操作:

[billc@bclinux ~]$ python3   進入python互交模式
Python 3.6.2 (default, Aug 20 2017, 10:04:14)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> import sys
>>> help(os.getcwd)      用help()查看用法

Help on built-in function getcwd in module posix:
getcwd()
    Return a unicode string representing the current working directory.

>>> help(os.popen)      用help()查看用法

Help on function popen in module os:
popen(cmd, mode='r', buffering=-1)
    # Supply os.popen()

>>> os.getcwd()         還不明白?做個實驗
'/home/billc'     列印了當前路徑

>>> os.popen('ls')     再做個實驗
<os._wrap_close object at 0x7f75fcda1208>  返回了一個對象

>>> os.popen('ls').readlines()  繼續做實驗
['Desktop\n', 'Documents\n', 'Downloads\n', 'Music\n', 'Pictures\n', 'Public\n', 'Videos\n']       輸出了ls命令的執行結果

還不懂怎麼辦?

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

疑難問題辨析

os.mkdir與os.makedirs

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

os.mkdir('a')

os.makedirs('a/b/c')

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

curdir是屬性,不是函數,返回一個字符串 『.』

abspath返回完整的路徑。

dirname和basename的輸入參數是完整路徑,basename返回文件名,dirname返回文件名前面的路徑。

os.path.abspath('file.txt')     #  /home/xxx/dir/file.txt

os.path.dirname('/home/xxx/dir/file.txt')     #  /home/xxx/dir

os.path.baseame('/home/xxx/dir/file.txt')     #  file.txt

os.path.dirname('../../file.txt')  # ../../

所以說,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.split('/home/xxx/dir/file.txt')  # ['/home/xxx/dir', 'file.txt']

os.path.splitext('file.txt')  # ['file', '.txt']

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名字建立一個仿真目錄。

具體事項如下:

從命令行獲取testcase名

確認項目根目錄,獲取當前目錄的相對路徑

用find命令獲取testcase的類別

如果類別不存在,則新建類別目錄,並產生Makefile

進入類別目錄裡

如果testcase目錄不存在,則新建,並創建仿真腳本的軟連結和Makefile

完畢後,列印成功提示

參考腳本:

    更多python的文章    

Why Python

初識Python語言

寫Python前的準備

我的第一個Python程序

Python的數據類型(一):介紹

Python的數據類型(二):數字

Python的數據類型(三):字符串

Python的數據類型(四):列表List與元組Tuple

Python的數據類型(五):字典Dict

Python的條件與循環

Python的函數(一):基本概念

Python的函數(二):作用域

Python的函數(三):參數傳遞

Python的函數(四):遞歸函數與匿名函數,函數的屬性與標註


寫Python選什麼編輯器,大家心裡都有數了吧。(原來用Emacs的人這麼少)

複製連結到瀏覽器查看完整《調查報告》(Python官網的調查報告):

https://www.jetbrains.com/research/python-developers-survey-2017/

廣告時間

歡迎關注ExASIC


分享數字集成電路設計中的經驗和方法

Sharing makes work smoother

相關焦點

  • python模塊三劍客之time os sys
    概要在python有幾個常用的模塊,今天來介紹一下python模塊中的三劍客:time模塊、os模塊、sys模塊。一、time模塊在python中,所有跟時間有關的操作都要用到時間模塊。我們在使用這個模塊之前,首先需要導入這個模塊。
  • 深度對比Python中4大文件處理庫(os、shutil、glob、pathlib)
    ② 任意指定路徑下的Path對象p = Path('C:/Users/Administrator/Desktop/python三劍客/pathlib庫/抽獎.txt')p = Path('C:/Users/Administrator/Desktop/python三劍客')p1 = p/'pathlib庫'p1
  • Python常用模塊os和shutil學習
    os就是「operating system」的縮寫,python中的os模塊提供了對目錄或者文件的新建/刪除/查看等屬性,還提供了對文件以及目錄的路徑操作,比如創建、刪除目錄等。關於OS模塊的目錄操作,可以看一下這篇文章:Python目錄操作總結下面是os模塊常用方法思維導圖shutil模塊shutil模塊屬於高級文件操作模塊,可以做os模塊的補充,主要可以實現文件的複製和解壓縮操作等等。
  • Python的os / shutil / Path 模塊介紹
    Python中對文件、文件夾(文件操作函數)的操作需要涉及到os模塊和shutil模塊。
  • 一文看懂Python對文件和文件夾的操作: 含os, shutil和glob模塊.Python學習面試必讀.
    小編我精心準備了個小結,教你如何利用python進行基本的文件和文件夾操作,並重點介紹了如何使用os, shutil和glob模塊進行常見的文件和文件夾操作,如遍歷,刪除文件和查找文件。如果你老是忘記關閉一個文件,我們強烈建議使用python的with聲明打開一個文件。這樣在你完成文件讀寫操作後,python會自動關閉文件對象。
  • Python 進階教程 | os、sys 庫的使用
    即前者會訪問子目錄SYS 庫sys 庫同樣也是 Python 的內置庫,下面介紹幾個該庫常見的方法或成員變量。sys.argv獲取腳本執行參數列表。一般來說 Python 程序執行參數的第一個參數(sys.argv[0])是當前文件名。
  • python讀寫文件
    今天我們就以這幾個需求為背景來看看python是如何讀寫文件的。基本概念介紹我們知道python中一切都是對象,「文件」也不例外。下面的實驗可以看出文件是名叫『_io.TextIOWrapper』的class。
  • 【Python入門】Python之shutil模塊11個常用函數詳解
    shutil 是 Python 中的高級文件操作模塊,與os模塊形成互補的關係,os主要提供了文件或文件夾的新建、刪除、查看等方法,還提供了對文件以及目錄的路徑操作。shimport shutil,ospath1 = os.path.join(os.getcwd(),"kaggle")path1'C:\\Users\\wuzhengxiang\\Desktop\\Python知識點總結\\kaggle'path2 = os.path.join(os.getcwd(),"bbb","ccc")path2
  • 轉載 | 誰說Python的shutil不支持7z解壓縮,我來教你擴展它的功能!
    不要說time、datetime、os、sys。這些模塊常用是常用,但是逼格不夠高啊。舉個例子,如果你經常在LeetCode上刷題,你會發現有時Java、C需要幾十行的算法題,如果Python使用了collections、itertools,可能三四行代碼就結束了。
  • 【python】os 模塊使用筆記
    幸運的是shutil模塊提供了copyfile()的函數,你還可以在shutil模塊中找到很多實用函數,它們可以看做是os模塊的補充。shutil.copyfile(src, dst) #文件到文件的拷貝,其中dst必須是一個文件shutil.copy(src, dst) #文件拷貝,src必須是一個文件,dst可以是一個文件或者目錄shutil.copy2(src, dst
  • 技巧|深度對比Python中4大文件/文件夾處理庫
    ② 任意指定路徑下的Path對象p = Path('C:/Users/Administrator/Desktop/python三劍客/pathlib庫/抽獎.txt')p = Path('C:/Users/Administrator/Desktop/python三劍客')p1 = p/'pathlib庫'p1
  • 讓VASP實現固定應力張量計算的python腳本
    秉承著能自動化就就絕不手動幹的精神,我寫了個python腳本來實現這個過程。該腳本會根據廣義胡克定律自動修改應變,然後迭代地調用VASP直到應力張量收斂到所期望的值。用這個代碼對W,Mo,Cr,alpha-Fe體系做了一些模擬,到目前為止表現還不錯。儘管如此,這始終是個beta版本,你可能會遇到一些我沒有考慮到的bug。
  • python os.listdir()亂碼解決方案
    有些人會使用os.remove來進行文件的清楚,從而導致一些錯誤的出現,可以說這是對於os.remove的用法還沒有熟練掌握。下面我們就os.remove的詳細用法及使用注意分別介紹。計算機一般來說是需要定期的清理,系統的內存不能無限延伸,同時有一些不需要的文件也可以得以清除掉。
  • python模塊之os
    python中的os模塊
  • 專題21 | Python文件複製、移動與重命名
    shutil.copy(s,d) #拷貝文件s到d目錄/文件夾shutil.copy(s1,s2) #複製文件s1,重命名為s2shutil.copyfile(s1,s2) #複製文件s1,重命名為s2shutil.copytree(d1,d2) #複製文件夾d1,重命名為d2import osimport shutil#檢查文件是否存在
  • Python在windows下的文件應用
    我們在使用追加打開方式的時候,python會自動創建文件。open(『test.txt『,w) 直接打開一個文件,如果文件不存在則創建文件創建目錄:os.mkdir(『file『) 創建目錄os.makedirs(outnewpath) 創建多級目錄,eg:os.makedirs('t2/t3/t4', mode=0o777)複製文件:import shutilshutil.copyfile
  • Python語言之Python探針實現原理
    關於 sys.meta_path 更詳細的資料請查閱 python 文檔中 sys.meta_path 相關內容以及 PEP 0302 。$ python meta_path1.pyfind_module httpload_module http<module 'sys' (built-in)>sys.version_info(major=3, minor=5, micro=1, releaselevel='final', serial=0)通過 sys.meta_path
  • 4招小技巧,帶你迅速提升Python文件處理的逼格
    it’s an important tool to learn是不是很方便,假如你在批處理郵件,有1000封郵件,你希望把裡面的標題改掉,這招是不是很爽.假如我們當前目錄下有這樣一個文件結構:|---backup--- |--abc.txt|---test01.txt---|---test02.txt---問題:我們想把test01.txt和text02.txt備份到backup下,怎麼辦解決:5行代碼搞定#!
  • 令人窒息的python騷操作
    range(1,61):sys.stdout.write('#'+'->'+"\b\b")sys.stdout.flush()time.sleep(0.5)方案三from progressbar import *import timeimport osrows, columns = os.popen('stty size