Python中的os模塊是主要和系統操做相關的模塊,在平時的工做中會常常用到,花時間整理了os模塊的高頻使用方法,同時整理出使用時須要注意的點。概括來說,os模塊的方法能夠分爲:目錄操做、文件操做、路徑操做、系統操做等四大類,咱們接下來依次進行介紹。node
# 當前目錄下建立目錄,注意第二個參數mode,在Windows被忽略 os.mkdir("test_folder") # 刪除目錄,若是目錄不爲空,則拋出OSError:[Errno 66] Directory not empty os.rmdir("test_folder") # 遍歷建立目錄,能夠建立多個目錄,其中exist_ok爲False,表示目錄存在拋出異常。 os.makedirs("a/b/c", exist_ok=False) # 遍歷刪除目錄,能夠直接,注意若是目錄不爲空,會拋出OSError:[Errno 66] Directory not empty os.removedirs("a/b/c") # 對文件或者目錄進行重命名,不能對路徑作變動 os.rename("a", "b") # os.rename的升級版本,能夠重命名文件,也能夠重命名文件的上級目錄。 os.renames("b", "a/b")
# 對目錄a下的文件進行遍歷,返回目錄下的名字列表,注意不會遍歷子目錄 file_name_list = os.listdir("a") print(file_name_list) ''' 功能:會遞歸遍歷對目錄a下的文件和目錄 參數:topdown表示遍歷目錄的優先級(True先遍歷根目錄,False先遍歷子目錄) onerror 當walk遇到錯誤時會調用 返回值: parent 指的是父目錄, dir_name返回parent目錄下全部的目錄 file_name返回parent目錄下全部的文件 ''' list_result = os.walk("a", topdown=True, onerror=None, followlinks=False) for parent, dir_name, file_name in list_result: print(parent) print(dir_name) print(file_name) print("============") # 和listdir相似,都是對第一層目錄遍歷,區別在於scandir返回的是迭代器 with os.scandir("a") as it: print("*"*12) for entry in it: print(entry.name)
須要注意的是,若是要遍歷的目錄下文件數量比較多,好比數百萬個文件,那麼就可使用os.scandir(),由於若是這時使用listdir()會形成內存緊張。python
# 獲取當前工做目錄所在的絕對路徑 print(os.getcwd()) # 返回.. 表示當前目錄的上級目錄 print(os.pardir) # 返回上級目錄,這裏用到了os.path.abspath,獲取絕對路徑 print(os.path.abspath(os.path.dirname(os.getcwd()))) # 用於改變當前工做目錄 os.chdir("a") print(os.getcwd())
# 判斷路徑a是否存在 print(os.path.exists("a")) # 判斷路徑a是不是目錄 print(os.path.isdir("a")) # 判斷路徑a是不是文件 print(os.path.isfile("a"))
''' 功能:返回文件/目錄對應的屬性 返回值:st_mode(權限模式)=16877, st_ino(inode節點號)=12897368202, st_dev(inode所在設備號)=16777220, st_nlink(inode連接數)=5, st_uid(文件全部者id)=501, st_gid(文件全部者的組id)=20, st_size(文件大小)=160, st_atime(上次訪問的時間)=1577449111, st_mtime(最後一次修改的事件)=1577449111, st_ctime(建立時間)=1577449111) ''' print(os.stat(".")) # 一樣,os也提供了單獨獲取某個屬性的方法 print(os.path.getatime(".")) print(os.path.getctime(".")) print(os.path.getmtime(".")) print(os.path.getsize(".")) # 修改文件的訪問時間和修改時間 os.utime(".", (1577449111, 1577449111))
在上面註釋中提到的inode,主要用來存儲文件的"元信息",好比文件的建立時間、文件的大小等,中文名叫做"索引節點"。linux
# Python的os提供了open和write方法來讀寫文件 # 打開文件 fd = os.open("test3.txt", os.O_RDWR | os.O_CREAT) # 這裏返回的是一個文件描述符 print(fd) # 寫入字符串 os.write(fd, b"This is test") # 將字符串刷新到硬盤上 os.sync() # 關閉文件 os.close(fd) # 做爲對比,Python提供了open方法能夠更方便的操做文件,因此咱們通常直接使用open方法。 with open("a/test3.txt", "wb") as f: # 這裏返回的是一個操做文件的BufferedWriter對象 print(f) f.write(b"aaaaaaaaa")
# 獲取路徑的相對路徑 print(os.path.abspath(".")) # 判斷路徑是不是相對路徑 print(os.path.isabs(".")) # 將路徑拼接在一塊兒 print(os.path.join(os.getcwd(), "a","b")) # 將傳入的路徑的最後一級目錄/文件拆分開,好比:傳入a/b/c/d 返回: a/b/c , d print(os.path.split(os.getcwd())) # 返回傳入路徑所在的目錄,好比:傳入a/b/c/d 返回:/a/b/c print(os.path.dirname(os.getcwd())) # 將傳入path分割爲路徑和擴展,好比:傳入a/b/c/d.txt 返回('a.b/c/d', '.text') print(os.path.splitext(os.path.abspath("./a/test3.txt")))
# 注意這裏執行的命令必定是在執行的操做系統存在的命令,好比在linux系統用ls,在windows系統用dir # 在當前進程中打開一個子shell(子進程)來執行命令 # 返回值:命令的執行狀態 0 執行成功、非0,表示執行不成功。 會將命令的執行結果寫入到stdout中,也就是控制檯。 print(os.system("la")) print("================") ''' 參數:cmd:要執行的命令。 mode:打開文件的模式,默認爲'r',用法與open()相同。 buffering:0意味着無緩衝;1意味着行緩衝;其它正值表示使用參數大小的緩衝。 負的bufsize意味着使用系統的默認值,通常來講,對於tty設備,它是行緩衝;對於其它文件,它是全緩衝。 返回:這個方法會返回一個管道,返回一個鏈接管道的文件對象,好比爲f,能夠經過f.readlines()和f.read()來讀取返回值。 ''' with os.popen("ls", "r", 1) as p: print(type(p)) r = p.read() print(r) print("end")
不過Python提供了更強大的subprocess模塊,使用subprocess.popen()方法會更加靈活。咱們後面會專門寫文章來介紹subprocess這個模塊的各類方法的使用。shell
# 返回當前進程的id print(os.getpid()) # 返回操做系統的信息 print(os.uname()) # 返回系統的環境變量 print(os.environ) # 返回系統的環境變量,PATH對應的值 print(os.environ.get('PATH'))
上面總結了python3中os模塊經常使用的方法,主要圍繞對路徑、目錄及系統命令的操做,你們在平時使用過程當中能夠靈活使用上面的各類方法,有時候須要多個方法搭配使用。我給你們留兩個練習題,這是我以前寫python腳本碰到的問題:編程
你們能夠思考下,而後在評論區寫下你的答案。windows
關注【公衆號:軟件測試佈道師】,回覆【python】,便可獲取【python自動化及編程實踐資料】