天天看點

12.19 Python os子產品詳解

除前面章節介紹的各種函數之外,os 子產品還提供了大量操作檔案和目錄的函數,本節将介紹 os 子產品下常用的函數。

如果讀者需要查閱有關這些函數的說明,則可通路 https://docs.python.org/3/library/os.html 頁面。

os子產品與目錄相關的函數

與目錄相關的函數如下:

  • os.getcwd():擷取目前目錄。
  • os.chdir(path):改變目前目錄。
  • os.fchdir(fd):通過檔案描述利改變目前目錄。該函數與上一個函數的功能基本相似,隻是該函數以檔案描述符作為參數來代表目錄。

    下面程式測試了與目錄相關的函數的用法:

    import os
    # 擷取目前目錄
    print(os.getcwd())
      # G:\publish\codes\12.7
      # 改變目前目錄
      os.chdir('../12.6')
      # 再次擷取目前目錄
      print(os.getcwd()) 
      # G:\publish\codes\12.6
               
    上面程式示範了使用 getcwd() 來擷取目前目錄,也示範了使用 chdir() 來改變目前目錄。
  • os.chroot(path):改變目前程序的根目錄。
  • os.listdir(path):傳回 path 對應目錄下的所有檔案和子目錄。
  • os.mkdir(path[, mode]):建立 path 對應的目錄,其中 mode 用于指定該目錄的權限。該 mode參數代表一個 UNIX 風格的權限,比如 0o777 代表所有者可讀/可寫/可執行、組使用者可讀/可寫/可執行、其他使用者可讀/可寫/可執行。
  • os.makedirs(path[, mode]):其作用類似于 mkdir(),但該函數的功能更加強大,它可以邊歸建立目錄。比如要建立 abc/xyz/wawa 目錄,如果在目前目錄下沒有 abc 目錄,那麼使用 mkdir() 函數就會報錯,而使用 makedirs() 函數則會先建立 abc,然後在其中建立 xyz 子目錄,最後在 xyz 子目錄下建立 wawa 子目錄。

    如下程式示範了如何建立目錄:

    import os
    path = 'my_dir'
    # 直接在目前目錄下建立目錄
    os.mkdir(path, 0o755)
    path = "abc/xyz/wawa"
    # 遞歸建立目錄
    os.makedirs(path, 0o755)
               
    正如從上面代碼所看到的,直接在目前目錄下建立 mydir 子目錄,是以可以使用 mkdir() 函數建立;需要程式遞歸建立 abc/xyz/wawa 目錄,是以使用 makedirs() 函數。
  • os.rmdir(path):删除 path 對應的空目錄。如果目錄非空,則抛出一個 OSError 異常。程式可以先用 os.remove() 函數删除檔案。
  • os.removedirs(path):遞歸删除目錄。其功能類似于 rmdir(),但該函數可以遞歸删除 abc/xyz/wawa 目錄,它會從 wawa 子目錄開始删除,然後删除 xyz 子目錄,最後删除 abc 目錄。

    如下程式示範了如何删除目錄:

    import os
    path = 'my_dir'
    # 直接删除目前目錄下的子目錄
    os.rmdir(path)
    path = "abc/xyz/wawa"
    # 遞歸删除子目錄
    os.removedirs(path)
               
    上面程式中第 5 行代碼使用 rmdir() 函數删除目前目錄下的 my_dir 子目錄,該函數不會執行遞歸删除;第 8 行代碼使用 removedirs() 函數删除 abc/xyz/wawa 目錄,該函數會執行遞歸删除,它會先删除 wawa 子目錄,然後删除 xyz 子目錄,最後才删除 abc 目錄。
  • os.rename(src, dst):重命名檔案或目錄,将 src 重名為 dst。
  • os.renames(old, new):對檔案或目錄進行遞歸重命名。其功能類似于 rename(),但該函數可以遞歸重命名 abc/xyz/wawa 目錄,它會從 wawa 子目錄開始重命名,然後重命名 xyz 子目錄,最後重命名 abc 目錄。

    如下程式示範了如何重命名目錄:

    import os
    path = 'my_dir'
    # 直接重命名目前目錄下的子目錄
    os.rename(path, 'your_dir')
    path = "abc/xyz/wawa"
    # 遞歸重命名子目錄
    os.renames(path, 'foo/bar/haha')
               
    上面程式中第 5 行代碼直接重命名目前目錄下的 my_dir 子目錄,程式會将該子目錄重命名為 your_dir;第 8 行代碼則執行遞歸重命名,程式會将 wawa 重命名為 haba,将 xyz 重命名為 bar,将 abc 重命名為 foo。

os子產品與權限相關的函數

與權限相關的函數如下:

  • os.access(path, mode):檢查 path 對應的檔案或目錄是否具有指定權限。該函數的第二個參數可能是以下四個狀态值的一個或多個值:
    • os.F_OK:判斷是否存在。
    • os.R_OK:判斷是否可讀。
    • os.W_OK:判斷是否可寫。
    • os.X_OK:判斷是否可執行。
    例如如下程式:
    import os
    # 判斷目前目錄的權限
    ret = os.access('.', os.F_OK|os.R_OK|os.W_OK|os.X_OK)
    print("os.F_OK|os.R_OK|os.W_OK|os.X_OK - 傳回值:", ret)
    # 判斷os.access_test.py檔案的權限
    ret = os.access('os.access_test.py', os.F_OK|os.R_OK|os.W_OK)
    print("os.F_OK|os.R_OK|os.W_OK - 傳回值:", ret)
               

    上面程式判斷目前目錄的權限和目前檔案的權限,這裡特意将此檔案設為隻讀的。運作該程式,可以看到如下輸出結果:

    os.F_OK|os.R_OK|os.W_OK|os.X_OK - 傳回值:True

    os.F_OK|os.R_OK|os.W_OK - 傳回值:False

  • os.chrnod(path, mode):更改權限。其中 mode 參數代表要改變的權限,該參數支援的值可以是以下一個或多個值的組合:
    • stat.S_IXOTH:其他使用者有執行權限。
    • stat.S_IWOTH:其他使用者有寫權限。
    • stat.S_TROTH:其他使用者有讀權限。
    • stat.S_IRWXO:其他使用者有全部權限。
    • stat.S_IXGRP:組使用者有執行權限。
    • stat.S_IWGRP:組使用者有寫權限。
    • stat.S_IRGRP:組使用者有讀權限。
    • stat.S_IRWXG:組使用者有全部權限。
    • stat.S_IXUSR:所有者有執行權限。
    • stat.S_IWUSR:所有者有寫權限。
    • stat.S_IRUSR:所有者有讀權限。
    • stat.S_IRWXU:所有者有全部權限。
    • stat.S_IREAD:Windows 将該檔案設為隻讀的。
    • stat.S_IWRITE:Windows 将該檔案設為可寫的。

    前面的那些權限都是 UNIX 檔案系統下有效的概念,UNIX 檔案系統下的檔案有一個所有者,跟所有者處于同一組的其他使用者被稱為組使用者。是以在 UNIX 檔案系統下允許為不同使用者配置設定不同的權限。

    例如如下程式:

    import os, stat
    # 将os.chmod_test.py
    檔案改為隻讀
    os.chmod('os.chmod_test.py', stat.S_IREAD)
    # 判斷是否可寫
    ret = os.access('os.chmod_test.py', os.W_OK)
    print("os.W_OK - 傳回值:", ret)
               
    運作上面程式後,os.chmod_test.py 變成隻讀檔案。
  • os.chown(path, uid, gid):更改檔案的所有者。其中 uid 代表使用者 id,gid 代表組 id。該指令主要在 UNIX 檔案系統下有效。
  • os.fchmod(fd, mode):改變一個檔案的通路權限,該檔案由檔案描述符 fd 指定。該函數的功能與 os.chmod() 函數的功能相似,隻是該函數使用 fd 代表檔案。
  • os.fchown(fd, uid, gid):改變檔案的所有者,該檔案由檔案描述符 fd 指定。該函數的功能與 os.chown() 函數的功能相似,隻是該函數使用 fd 代表檔案。

os子產品與檔案通路相關的函數

與檔案通路相關的函數如下:

  • os.open(file, flags[, mode]):打開一個檔案,并且設定打開選項,mode 參數是可選的。該函數傳回檔案描述符。其中 flags 代表打開檔案的旗标,它支援如下一個或多個選項:
    • os.O_RDONLY:以隻讀的方式打開。
    • os.O_WRONLY:以隻寫的方式打開。
    • os.O_RDWR:以讀寫的方式打開。
    • os.O_NONBLOCK:打開時不阻塞。
    • os.O_APPEND:以追加的方式打開。
    • os.O_CREAT:建立并打開一個新檔案。
    • os.O_TRUNC:打開一個檔案并截斷它的長度為0(必須有寫權限)。
    • os.O_EXCL:在建立檔案時,如果指定的檔案存在,則傳回錯誤。
    • os.O_SHLOCK:自動擷取共享鎖。
    • os.O_EXLOCK:自動擷取獨立鎖。
    • os.O_DIRECT:消除或減少緩存效果。
    • os.O_FSYNC:同步寫入。
    • os.O_NOFOLLOW:不追蹤軟連結。
  • os.read(fd, n):從檔案描述符 fd 中讀取最多 n 個位元組,傳回讀到的字元串。如果檔案描述符副對應的檔案己到達結尾,則傳回一個空位元組串。
  • os.write(fd, str):将位元組串寫入檔案描述符 fd 中,傳回實際寫入的位元組串長度。
  • os.close(fd):關閉檔案描述符 fd。
  • os.lseek(fd, pos, how):該函數同樣用于移動檔案指針。其中 how 參數指定從哪裡開始移動,如果将 how 設為 0 或 SEEK_SET,則表明從檔案開頭開始移動;如果将 how 設為 1 或 SEEK_CUR,則表明從檔案指針目前位置開始移動;如果将 how 設為 2 或 SEEK_END,則表明從檔案結束處開始移動。上面幾個函數同樣可用于執行檔案的讀寫,程式通常會先通過 os.open() 打開檔案,然後調用 os.read()、os.write() 來讀寫檔案,當操作完成後通過 os.close() 關閉檔案。

    如下程式示範了使用上面的函數來讀寫檔案:

    import os
    # 以讀寫、建立方式打開檔案
    f = os.open('abc.txt', os.O_RDWR|os.O_CREAT)
    # 寫入檔案内容
    len1 = os.write(f, '水晶潭底銀魚躍,\n'.encode('utf-8'))
    len2 = os.write(f, '清徐風中碧竿橫。\n'.encode('utf-8'))
    # 将檔案指針移動到開始處os.lseek(f, 0, os.SEEK_SET)
    # 讀取檔案内容data = os.read(f, len1 + len2)
    # 列印讀取到位元組串print(data)
    # 将位元組串恢複成字元串
    print(data.decode('utf-8'))
    os.close(f)
               
    上面程式中,第 6、7 行代碼用于向所打開的檔案中寫入資料;第 11 行代碼用于讀取檔案内容。
  • os.fdopen(fd[, mode[, bufsize]]):通過檔案描述符 fd 打開檔案,并傳回對應的檔案對象。
  • os.closerange(fd_low, fd_high):關閉從 fd_low(包含)到 fd_high(不包含)範圍的所有檔案描述符。
  • os.dup(fd):複制檔案描述符。
  • os.dup2(fd,fd2):将一個檔案描述符fd複制到另一個檔案描述符fd2中。
  • os.ftruncate(fd, length):将 fd 對應的檔案截斷到 length 長度,是以此處傳入的 length 參數不應該超過檔案大小。
  • os.remove(path):删除 path 對應的檔案。如果 path 是一個檔案夾,則抛出 OSError 錯誤。如果要删除目錄,則使用 os.rmdir()。
  • os.link(src, dst):建立從 src 到 dst 的硬連結。硬連結是 UNIX 系統的概念,如果在 Windows 系統中就是複制目标檔案。
  • os.symlink(src, dst):建立從 src 到 dst 的符号連結,對應于 Windows 的快捷方式。

由于 Windows 權限的緣故,是以必須以管理者身份執行 os.symlink() 函數來建立快捷方式。

下面程式示範了在 Windows 系統中使用 os.symlink(src, dst) 函數來建立快捷方式:

import os
# 為os.link_test.py檔案建立快捷方式
os.symlink('os.link_test.py', 'tt')
# 為os.link_test.py檔案建立硬連接配接(Windows上就是複制檔案)
os.link('os.link_test.py', 'dst')
           

上面程式使用 symlink() 函數為指定檔案建立符号連結,在 Windows 系統中就是建立快捷方式;使用 link() 函數建立硬連結,在 Windows 系統中就是複制檔案。

運作上面程式,将會看到程式在目前目錄下建立了一個名為“tt”的快捷方式,并将 os.link_test.py 檔案複制為 dst 檔案。