os模塊的簡介參看 Python::OS 模塊 -- 簡介
os模塊的進程管理 Python::OS 模塊 -- 進程管理
os模塊的進程參數 Python::OS 模塊 -- 進程參數
os模塊中包含了一系列文件操作的函數,這里介紹的是一些在Linux平台上應用的文件操作函數。由於Linux是C寫的,低層的libc庫和系統調用的接口都是C API,而Python的os模塊中包括了對這寫接口的Python實現,通過Python的os模塊,可以調用系統的功能,進行系統編程。
下面介紹一下os模塊中提供的一些文件操作(僅限Unix平台):
返回文件對象的操作
os.fdopen(fd, [mode, [bufsize]])
通過文件描述符 fd 創建一個文件對象,並返回這個文件對象
fd參數是一個打開的文件的描述符,在Unix下,描述符是一個小整數。
mode參數是可選的,和buffersize參數和Python內建的open函數一樣,mode參數可以指定‘r,w,a,r+,w+,a+,b’等,表示文件的是只讀的還是可以讀寫的,以及打開文件是以二進制還是文本形式打開。這些參數和C語言中的<stdio.h>中fopen函數中指定的mode參數類似。
bufsize參數是可選的,指定返回的文件對象是否帶緩沖:buffersize=0,表示沒有帶緩沖;bufsize=1,表示該文件對象是行緩沖的;bufsize=正數,表示使用一個指定大小的緩沖沖,單位為byte,但是這個大小不是精確的;bufsize=負數,表示使用一個系統默認大小的緩沖,對於tty字符設備一般是行緩沖,而對於其他文件則一般是全緩沖。如果這個參數沒有制定,則使用系統默認的緩沖設定。
os.popen(command, [mode, [bufsize]])
開啟一個子進程執行一個command指定的命令,在父進程和子進程之間建立一個管道pipe,用於在父子進程間通信。返回一個文件對象,可以對這個文件對象進行讀或寫,取決於參數mode,如果mode指定了只讀,那么只能對文件對象進行讀,如果mode參數指定了只寫,那么只能對文件對象進行寫操作。
command參數指定需要在子進程中執行的命令.
mode參數和bufsize參數和上述的os.fdopen一樣。
os.popen函數還有一些其他的變種,可以按需要使用:
os.popen2(command, [mode, [bufsize]])
在子進程中執行命令command,返回一個二元組(child_stdin, child_stdout)
os.popen3(command, [mode, [bufsize]])
在子進程中執行命令command,返回一個三元組(child_stdin, child_stdout, child_stderr)
os.popen4(command, [mode, [bufsize]])
在子進程中執行命令command,返回一個二元組(child_stdin, child_stdout_and_stderr)
os.tmpfile()
返回一個以”w+b“模式打開的文件對象,該文件對象對應的文件無法通過目錄訪問,這是一個臨時文件,當文件對象被關閉的時候,該臨時文件也就被刪除。
文件描述符操作
os.close(fd)
以文件描述符fd為參數來關閉fd指向的打開的文件。
os.closerange(fd_low, fd_high)
關閉一些列連續的文件描述符,文件描述符的范圍從fd_low到fd_high - 1。
os.dup(fd)
返回一個復制的文件描述符,返回的描述符指向的文件和描述符fd指向的文件是一致的。
os.dup2(fd, fd2)
復制一個描述符fd,產生一個描述符fd2,如果fd2指向的文件打開着,則關閉該文件,使得釋放這個被占用的文件描述符。
os.fchmod(fd, mode)
改變一個文件的訪問權限,該文件由參數fd指定,參數mode是Unix下的文件訪問權限。相當於Unix下的chmod命令,只是這里是系統提供的一個改變文件權限的接口,文件權限包括”rwx”表示的讀,寫,執行權限,以及針對用戶的”ugo“三個對象,表示擁有者用戶,組用戶,其他用戶。
os.fchown(fd, uid, gid)
修改一個文件的所有權,這個函數修改一個文件的用戶ID和用戶組ID,該文件由文件描述符fd指示。如果uid和gid中任何一個設置為-1,則表示不對其進行修改。
os.fdatasync(fd)
強制將文件寫入磁盤,該文件由文件描述符fd指示,但是不強制更新文件的狀態信息。
os.fstat(fd)
返回包含了文件描述符fd指向的文件的文件信息,這個函數的實現和stat()系統調用是一樣的,返回文件的信息:
st_mode - 文件信息的掩碼,包含了文件的權限信息,文件的類型信息(是普通文件還是管道文件,或者是其他的文件類型)
st_ino - 文件的i-node值
st_dev - 設備信息
st_nlink - 硬連接數
st_uid - 用戶ID
st_gid - 組ID
st_size - 文件大小,以byte為單位
st_atime - 文件最近的訪問時間
st_mtime - 文件最近的修改時間
st_ctime - 文件狀態信息的修改時間(不是文件內容的修改時間)
不同的Unix系統上可能還會有一寫擴展的信息可供調用。如在Linux系統上,還包含了如下的一些信息:
st_blocks - 文件的是由多少個 512 byte 的塊構成的
除了上述的fstat()函數,os模塊還包含了stat(),lstat()等函數,用於獲取文件信息。
os.ftruncate(fd, length)
將文件大小截斷為length字節長度,如果length指定為0,則相當於在os.open()一個文件的時候指定os.O_TRUNC選項,文件描述符指示截斷的文件。
os.isatty(fd)
檢查一個文件描述符fd指示的文件是否是一個tty字符設備文件,如果是,則返回true,否則返回false。
os.lseek(fd, pos, how)
設置文件偏移位置,文件由文件描述符fd指示。這個函數依據how參數來確定文件偏移的起始位置,pos參數指定位置的偏移量。
how參數的值為:
os.SEEK_SET - 文件的開頭, 可以用 0 代替
os.SEEK_CUR - 當前的文件偏移處, 可以用 1 代替
os.SEEK_END - 文件結尾, 可以用 2 代替
os.open(file, flags[, mode])
打開一個文件,並且設置需要的打開選項,mode參數是可選的,如果flags選項中包含了os.O_CREAT選項,則需要指定mode參數,指示文件創建時使用的權限。函數返回一個文件描述符,用於對該文件的訪問。
flags常用參數(可以參看Linux man-page open(2)):
os.O_RDONLY - 文件以只讀方式打開
os.O_WRONLY - 文件以只寫方式打開
os.O_RDWR - 文件以讀寫方式打開
os.O_APPEND - 文件以添加方式打開
os.O_TRUNC - 文件大小截斷為0
os.O_CREAT - 如果文件不存在,則創建文件
os.O_EXCL - 如果文件存在,並且指定了os.O_CREAT,則在指定該選項的情況下os.open調用會拋出OSError異常。
這個os.open()調用是一個低層的I/O調用,相當於在C API中的open系統調用。在使用的時候可以使用Python內建的open函數,該函數是對這個低層I/O的封裝。
os.pipe()
創建一個用於父子進程間通信的管道,返回一個二元組(read_fd, write_fd),read_fd指示創建的管道的讀描述符,write_fd指示創建的管道的寫描述符。關於Linux下管道的信息,可以參看 IPC-管道 。
os.read(fd, n)
從fd指示的文件中讀取最多n個字節的數據,函數返回一個包含讀取內容的字符串對象。如果讀取到文件尾,則返回一個空字符串對象。
os.write(fd, str)
將字符串str寫入到文件中,文件描述符fd指示處理的文件,函數返回實際寫入的字節個數。
文件和目錄操作
os.access(path, mode)
使用實際的uid和gid去測試路徑的訪問權。實際的uid和gid指的是用戶登錄到系統使用的uid和當前用戶所在的gid,這和有效用戶id和有效組id是有區別的,有效用戶id和有效組id是對應於進程的。
mode參數指定測試路徑的方式:
os.F_OK - 測試路徑是否存在
os.R_OK - 測試文件是否可讀
os.W_OK - 測試文件是否可寫
os.X_OK - 測試文件是否可執行
其中的R_OK,W_OK,X_OK是可以使用OR操作合起來進行一起測試的。
函數返回True如果測試成功,否則返回False。在系統的C API中可以使用access系統調用。
os.chdir(path)
切換當前的工作目錄為path指定的目錄,相當於Linux下cd命令的功能。
os.fchdir(fd)
通過文件描述符切換當前的工作目錄到文件描述符指示的目錄,fd參數必須指向打開的目錄,不能是文件。
os.getcwd()
以字符串的形式返回當前的工作目錄。
os.chroot(path)
切換當前進程的root目錄到指定的path路徑下,這個函數可以方便的為當前的進程創建一個自定義的運行環境,如果想創建一個沙盒運行環境,這個函數就很有用,功能類似於Linux下的chroot命令。
os.chmod(path, mode)
修改路徑的權限,mode參數指定了需要設置的權限。這個函數和os.fchmod()功能一致,區別是os.fchmod處理的是一個文件描述符,也就是說需要先打開一個文件獲取該文件的文件描述符后才可以進行操作,而os.chmod()直接在文件名上進行操作。
mode參數定義在 stat 模塊中:
stat.S_ISUID – 設置用戶ID
stat.S_ISGID - 設置用戶組ID
stat.S_ISVTX - 設置粘滯位,目前只對目錄有效,相當於在Linux中的SBIT位。
stat.S_IRUSR - 設置用戶讀權限位
stat.S_IWUSR - 設置用戶寫權限位
stat.S_IXUSR - 設置用戶執行權限位
stat.S_IRWXU - 相當於是S_IRUSR,S_IWUSR,S_IXUSR的OR運算的值
stat.S_IRGRP - 設置組讀權限位
stat.S_IWGRP - 設置組寫權限位
stat.S_IXGRP - 設置組執行權限位
stat.S_IRWXG - 相當於是S_IRGRP,S_IWGRP,S_IXGRP的OR運算的值
stat.S_IROTH - 設置其他用戶的讀權限
stat.S_IWOTH - 設置其他用戶的寫權限
stat.S_IXOTH - 設置其他用戶的執行權限
stat.S_IRWXO - 相當於是S_IROTH,S_IWOTH,S_IXOTH的OR運算的值
os.chown(path, uid, gid)
設置文件的用戶id和組id,和os.fchown()類似,區別是后者接受的是一個文件描述符。如果不需要修改,則在指定的id位置設置為-1。
os.lchmod(path, mode)
修改文件的權限屬性,如果path指示的路徑是一個符號鏈接,則只會作用於該符號鏈接自身,不會修改其連接的源文件。
os.lchown(path, uid, gid)
修改文件的uid和gid,和os.chown()函數功能一樣,區別是如果path指示的路徑是一個符號鏈接,則只會修改符號鏈接自身,不會修改其連接的源文件。
os.link(source, link_name)
給文件source創建一個硬連接link_name,相當於Linux中的不叫-s選項的ln命令。
os.listdir(path)
返回一個由path指定的目錄中的所有文件組成的列表。返回的列表是沒有經過排序的。並且返回的列表中不包含‘.’和‘..’這兩項。這個是一個很實用的函數。
os.lstat(path)
stat()系列函數中的一個,如果path指定的是一個符號鏈接,則該函數只會處理該符號鏈接自身,不會處理該鏈接的源文件。
os.mkinfo(path[, mode])
創建一個FIFO有名管道,相當於Linux下C API中的mkfifo()系統調用。mode參數指定了有名管道創建時指定的權限。和os.pipe()類似,只不過os.pipe()創建的是一個無名管道,只能用於有親緣關系的進程間通信,而FIFO有名管道可以在兩個沒有任何親緣關系的管道間通信,只要指定path就可以了。關於Linux下管道的內容,可以參看 IPC-管道 。
os.mkdir(path[, mode])
創建一個名為path的目錄,同時可以指定mode權限。當設置mode權限的時候,需要和系統中的umask掩碼進行運算,最后才是目錄的權限。如果mode沒有指定,則其值為0777。如果將要創建的目錄已經存在,則會拋出os.OSError異常。
os.makedirs(path[, mode])
遞歸地創建目錄,和os.mkdir()函數類似,區別是該函數可以遞歸地創建多級目錄。在創建過程中,如果子目錄已存在或者該目錄無法創建,則會拋出一個OSError異常。
os.readlink(path)
讀一個符號鏈接,返回一個字符串對象,表示符號鏈接的源文件的位置。返回的結果可能是一個絕對路徑,也可能是一個相對路徑。
os.remove(path)
刪除一個文件,文件由path指定。如果path指定的是一個目錄,則拋出一個OSError異常。在Unix下,該函數會先刪除該文件名,如果該文件還在被別的進程使用,則該文件占據的空間還是會被保留,知道沒有進程使用這個文件。和os.unlink()的工作機制一樣。
os.removedirs(path)
遞歸地刪除目錄,和os.rmdir()類似,區別是os.removedirs()可以刪除非空目錄。os.removedirs()嘗試連續地刪除每一個在path中給定的父目錄直到一個錯誤被拋出,但是該錯誤通常被忽略,因為這一般意味着這個父目錄是非空的。例如:當path指定為“foo/bar/baz”的時候,先刪除目錄“foo/bar/baz”如果非空的話,然后刪除“foo/bar”如果非空的話,最后刪除“foo”如果該目錄是空的。如果無法連續的刪除給定的目錄,則拋出一個OSError異常。
os.rename(src, dst)
對文件或目錄進行重命名,如果dst指定的是一個目錄,則會拋出一個OSError異常。在Unix系統中,如果dst是一個已經存在的文件,則會替換該文件如果權限允許的話。在一些Unix系統中可能會失敗如果src和dst是在不同的文件系統上。如果可以成功操作,則該操作是一個原子操作。
os.renames(old, new)
遞歸地對目錄進行更名,也可以對文件進行更名。和os.rename()的區別是,該函數會自動創建所有的中間目錄,在創建中間目錄的過程中,每創建好一個新目錄后使用os.removedirs()刪除對應的舊目錄。
注意:這個函數可能會在創建新的目錄結構的時候操作失敗,如果在刪除舊目錄的過程中出現刪除權限問題。
os.rmdir(path)
刪除path指定的空目錄,如果目錄非空,則拋出一個OSError異常。
os.stat(path)
獲取path指定的路徑的信息,功能等同於C API中的stat()系統調用。該函數是stat函數族中的一種,和前述的lstat(),fstat()函數類似,只不過stat()函數處理的是目錄,而且遇到符號鏈接的時候是處理符號鏈接的源文件的,而不是符號鏈接自身。
os.symlink(source, link_name)
為源文件source創建一個符號鏈接link_name。
os.unlink(path)
刪除一個path指定的文件,和os.remove()的工作機制一樣。
os.utime(path, times)
修改文件的訪問時間和修改時間。如果times參數為None,則設置文件的訪問時間和修改時間為當前的時間。否則,如果times參數不為空,則times參數是一個二元組(atime, mtime),用於設置文件的訪問時間和修改時間。
os.tempnam([dir[, prefix]])
返回一個獨一無二的路徑名作為臨時文件的文件名。返回的路徑名是一個絕對路徑,該臨時文件名的入口由dir參數指定,如果dir參數沒有指定或者為None,則用通用的臨時文件目錄作為臨時文件的目錄。如果dir被指定,並且不是None,則prefix參數被用來作為創建的臨時文件名的前綴。
os.tmpnam()
返回一個獨一無二的路徑名作為臨時文件的文件名,該文件名被創建者通用的臨時文件目錄下。
注意:os.tmpnam()和os.tempnam()只是負責生產一個臨時文件的路徑名,而不負責文件的創建和刪除。
os.walk(top, topdown = True, onerror = None, followlinks = False)
以自頂向下遍歷目錄樹或者以自底向上遍歷目錄樹,對每一個目錄都返回一個三元組(dirpath, dirnames, filenames)。
三元組(dirpath,dirnames,filenames):
dirpath - 遍歷所在目錄樹的位置,是一個字符串對象
dirnames - 目錄樹中的子目錄組成的列表,不包括("."和"..")
filenames - 目錄樹中的文件組成的列表
如果可選參數topdown = True或者沒有指定,則其實目錄的三元組先於其子目錄的三元組生成(自頂向下生成三元組),如果topdown = False,則起始目錄的三元組在其子目錄的三元組生成后才生成(自底向上生成三元組)。
當topdown = True,os.walk()函數會就地修改三元組中的dirnames列表(可能是使用del或者進行切片),然后再使用os.walk()遞歸地處理剩余在dirnames列表中的目錄。這種方式有助於加快搜索效率,可以指定特殊的遍歷順序。當topdown = False的時候修改dirnames是無效的,因為在使用自底向上進行遍歷的時候子目錄的三元組是先於上一級目錄的三元組創建的。
默認情況下,調用listdir()返回的錯誤會被忽略,如果可選參數oneerror被指定,則oneerror必須是一個函數,該函數有一個OSError實例的參數,這樣可以允許在運行的時候即使出現錯誤的時候不會打斷os.walk()的執行,或者拋出一個異常並終止os.walk()的運行。
默認情況下,os.walk()遍歷的時候不會進入符號鏈接,如果設置了可選參數followlinks = True,則可以進入符號鏈接。
注意:當設置followlinks = True時,可能會出現循環遍歷,因為符號鏈接可能會出現自己鏈接自己的情況,而os.walk()不會意識到這一點。
注意:如果傳遞過去的路徑名是一個相對路徑,則不會修改當前的工作路徑。
使用os.walk遍歷目錄真的很方便:
#-*- coding:utf-8 -*- import os if __name__ == '__main__': try: '''traval and list all files and all dirs''' for root, dirs, files in os.walk('D:' + os.sep + 'Python27'): print '-------------------directory < ' + root + ' > --------------------------' for d in dirs: print d for f in files: print f except OSError, e: print os.strerror(e.errno)