【python測試開發棧】—幫你總結Python os模組高頻使用的方

farsun發表於2021-09-09

Python中的os模組是主要和系統操作相關的模組,在平時的工作中會經常用到,花時間整理了os模組的高頻使用方法,同時整理出使用時需要注意的點。歸納來講,os模組的方法可以分為:目錄操作、檔案操作、路徑操作、系統操作等四大類,我們接下來依次進行介紹。

目錄操作相關

建立、刪除、重新命名目錄

    # 當前目錄下建立目錄,注意第二個引數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()會造成記憶體緊張。

獲取目錄

    # 獲取當前工作目錄所在的絕對路徑
    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,主要用來儲存檔案的"元資訊",比如檔案的建立時間、檔案的大小等,中文名叫作"索引節點"。

讀寫檔案

  # 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這個模組的各種方法的使用。

系統操作

    # 返回當前程式的id
    print(os.getpid())
    # 返回作業系統的資訊
    print(os.uname())
    # 返回系統的環境變數
    print(os.environ)
    # 返回系統的環境變數,PATH對應的值
    print(os.environ.get('PATH'))

總結

上面總結了python3中os模組常用的方法,主要圍繞對路徑、目錄及系統命令的操作,大家在平時使用過程中可以靈活使用上面的各種方法,有時候需要多個方法搭配使用。我給大家留兩個練習題,這是我之前寫python指令碼碰到的問題:

  • 獲取某個目錄下面最新的檔案
  • 將所有以error.log結尾的檔案,全部放到某個對應目錄下。

大家可以思考下,然後在評論區寫下你的答案。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4289/viewspace-2824641/,如需轉載,請註明出處,否則將追究法律責任。

相關文章