os模塊中包含了一系列文件操做的函數,這裏介紹的是一些在Linux平臺上應用的文件操做函數。因爲Linux是C寫的,低層的libc庫和系統調用的接口都是C API,而Python的os模塊中包括了對這寫接口的Python實現,經過Python的os模塊,能夠調用系統的功能,進行系統編程。html
下面介紹一下os模塊中提供的一些文件操做(僅限Unix平臺):node
os.fdopen(fd, [mode, [bufsize]])編程
經過文件描述符 fd 建立一個文件對象,並返回這個文件對象async
fd參數是一個打開的文件的描述符,在Unix下,描述符是一個小整數。函數
mode參數是可選的,和buffersize參數和Python內建的open函數同樣,mode參數能夠指定‘r,w,a,r+,w+,a+,b’等,表示文件的是隻讀的仍是能夠讀寫的,以及打開文件是以二進制仍是文本形式打開。這些參數和C語言中的<stdio.h>中fopen函數中指定的mode參數相似。post
bufsize參數是可選的,指定返回的文件對象是否帶緩衝:buffersize=0,表示沒有帶緩衝;bufsize=1,表示該文件對象是行緩衝的;bufsize=正數,表示使用一個指定大小的緩衝衝,單位爲byte,可是這個大小不是精確的;bufsize=負數,表示使用一個系統默認大小的緩衝,對於tty字符設備通常是行緩衝,而對於其餘文件則通常是全緩衝。若是這個參數沒有制定,則使用系統默認的緩衝設定。測試
os.popen(command, [mode, [bufsize]])ui
開啓一個子進程執行一個command指定的命令,在父進程和子進程之間創建一個管道pipe,用於在父子進程間通訊。返回一個文件對象,能夠對這個文件對象進行讀或寫,取決於參數mode,若是mode指定了只讀,那麼只能對文件對象進行讀,若是mode參數指定了只寫,那麼只能對文件對象進行寫操做。spa
command參數指定須要在子進程中執行的命令.code
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)