python学习笔记(十二)标准库os
os 模塊提供了訪問操作系統服務的功能,它所包含的內容比較多。
>>> import os >>> dir(os) ['EX_CANTCREAT', 'EX_CONFIG', 'EX_DATAERR', 'EX_IOERR', 'EX_NOHOST', 'EX_NOINPUT', 'EX_NOPERM', 'EX_NOUSER','EX_OK', 'EX_OSERR', 'EX_OSFILE', 'EX_PROTOCOL', 'EX_SOFTWARE', 'EX_TEMPFAIL', 'EX_UNAVAILABLE', 'EX_USAGE', 'F_OK', 'NGROUPS_MAX', 'O_APPEND', 'O_ASYNC', 'O_CREAT', 'O_DIRECT', 'O_DIRECTORY', 'O_DSYNC', 'O_EXCL', 'O_LARGEFILE', 'O_NDELAY', 'O_NOATIME', 'O_NOCTTY', 'O_NOFOLLOW', 'O_NONBLOCK', 'O_RDONLY', 'O_RDWR', 'O_RSYNC', 'O_SYNC', 'O_TRUNC', 'O_WRONLY', 'P_NOWAIT', 'P_NOWAITO', 'P_WAIT', 'R_OK', 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'ST_APPEND', 'ST_MANDLOCK', 'ST_NOATIME', 'ST_NODEV', 'ST_NODIRATIME', 'ST_NOEXEC', 'ST_NOSUID', 'ST_RDONLY', 'ST_RELATIME', 'ST_SYNCHRONOUS', 'ST_WRITE', 'TMP_MAX', 'UserDict', 'WCONTINUED', 'WCOREDUMP', 'WEXITSTATUS', 'WIFCONTINUED', 'WIFEXITED', 'WIFSIGNALED', 'WIFSTOPPED', 'WNOHANG', 'WSTOPSIG', 'WTERMSIG', 'WUNTRACED', 'W_OK', 'X_OK', '_Environ', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_copy_reg', '_execvpe', '_exists', '_exit', '_get_exports_list', '_make_stat_result', '_make_statvfs_result', '_pickle_stat_result', '_pickle_statvfs_result', '_spawnvef', 'abort', 'access', 'altsep', 'chdir', 'chmod', 'chown', 'chroot', 'close', 'closerange', 'confstr', 'confstr_names', 'ctermid', 'curdir', 'defpath', 'devnull', 'dup', 'dup2', 'environ', 'errno', 'error', 'execl', 'execle', 'execlp', 'execlpe', 'execv', 'execve', 'execvp', 'execvpe', 'extsep', 'fchdir', 'fchmod', 'fchown', 'fdatasync', 'fdopen', 'fork', 'forkpty', 'fpathconf', 'fstat', 'fstatvfs', 'fsync', 'ftruncate', 'getcwd', 'getcwdu', 'getegid', 'getenv', 'geteuid', 'getgid', 'getgroups', 'getloadavg', 'getlogin', 'getpgid', 'getpgrp', 'getpid', 'getppid', 'getresgid', 'getresuid', 'getsid', 'getuid', 'initgroups', 'isatty', 'kill', 'killpg', 'lchown', 'linesep', 'link', 'listdir', 'lseek', 'lstat', 'major', 'makedev', 'makedirs', 'minor', 'mkdir', 'mkfifo', 'mknod', 'name', 'nice', 'open', 'openpty', 'pardir', 'path', 'pathconf', 'pathconf_names', 'pathsep', 'pipe', 'popen', 'popen2', 'popen3', 'popen4', 'putenv', 'read', 'readlink', 'remove', 'removedirs', 'rename', 'renames', 'rmdir', 'sep', 'setegid', 'seteuid', 'setgid', 'setgroups', 'setpgid', 'setpgrp', 'setregid', 'setresgid', 'setresuid', 'setreuid', 'setsid', 'setuid', 'spawnl', 'spawnle', 'spawnlp', 'spawnlpe', 'spawnv', 'spawnve', 'spawnvp', 'spawnvpe', 'stat', 'stat_float_times', 'stat_result', 'statvfs', 'statvfs_result', 'strerror', 'symlink', 'sys', 'sysconf', 'sysconf_names', 'system', 'tcgetpgrp', 'tcsetpgrp', 'tempnam', 'times', 'tmpfile', 'tmpnam', 'ttyname', 'umask', 'uname', 'unlink', 'unsetenv', 'urandom', 'utime', 'wait', 'wait3', 'wait4', 'waitpid', 'walk', 'write']這么多內容不能都介紹,況且不少方法在實踐中用的不多,比如 os.popen() 在實踐中用到了,但是 os 模塊還有 popen2、popen3、popen4,這三個我在實踐中都沒有用過,或者有別人用了,也請補充。不過,我下面介紹的都是自認為用的比較多的,至少是我用的比較多或者用過的。如果沒有讀者要是用,但是我這里沒有介紹,讀者也完全可以自己用我們常用的help() 來自學明白其應用方法,當然,還有最好的工具——google(內事不決問 google,外事不明問谷歌,須梯子)。
操作文件:重命名、刪除文件
在對文件操作的時候,open() 這個內建函數可以建立、打開文件。但是,如果對文件進行改名、刪除操作,就要是用 os 模塊的方法了。
首先建立一個文件,文件名為 22201.py,文件內容是:
#!/usr/bin/env python # coding=utf-8print "This is a tmp file."然后將這個文件名稱修改為其它的名稱。
>>> import os >>> os.rename("22201.py", "newtemp.py")注意,我是先進入到了文件 22201.py 的目錄,然后進入到 Python 交互模式,所以,可以直接寫文件名,如果不是這樣,需要將文件名的路徑寫上。os.rename("22201.py", "newtemp.py")中,第一個文件是原文件名稱,第二個是打算修改成為的文件名。
$ ls new* newtemp.py查看,能夠看到這個文件。并且文件內容可以用 cat newtemp.py 看看(這是在 ubuntu 系統,如果是 windows 系統,可以用其相應的編輯器打開文件看內容)。
Help on built-in function rename in module posix:rename(...)rename(old, new)Rename a file or directory.除了修改文件名稱,還可以修改目錄名稱。請注意閱讀幫助信息。
另外一個 os.remove(),首先看幫助信息,然后再實驗。
Help on built-in function remove in module posix:remove(...)remove(path)Remove a file (same as unlink(path)).比較簡單。那就測試一下。為了測試,先建立一些文件吧。
$ pwd /home/qw/Documents/VBS/StarterLearningPython/2code/rd這是我建立的臨時目錄,里面有幾個文件:
$ ls a.py b.py c.py下面刪除 a.py 文件
>>> import os >>> os.remove("/home/qw/Documents/VBS/StarterLearningPython/2code/rd/a.py")看看刪了嗎?
$ ls b.py c.py果然管用呀。再來一個狠的:
>>> os.remove("/home/qw/Documents/VBS/StarterLearningPython/2code/rd") Traceback (most recent call last): File "<stdin>", line 1, in <module> OSError: [Errno 21] Is a directory: '/home/qw/Documents/VBS/StarterLearningPython/2code/rd'報錯了。我打算將這個目錄下的所剩文件刪光光。這么做不行。注意幫助中一句話 Remove a file,os.remove() 就是用來刪除文件的。并且從報錯中也可以看到,告訴我們錯誤的原因在于那個參數是一個目錄。
要刪除目錄,還得繼續向下學習。
操作目錄
os.listdir:顯示目錄中的文件
Help on built-in function listdir in module posix:listdir(...)listdir(path) -> list_of_stringsReturn a list containing the names of the entries in the directory.path: path of directory to listThe list is in arbitrary order. It does not include the special entries '.' and '..' even if they are present in the directory.看完幫助信息,讀者一定覺得這是一個非常簡單的方法,不過,特別注意它返回的值是列表,還有就是如果文件夾中有那樣的特殊格式命名的文件,不顯示。在 linux 中,用 ls 命令也看不到這些隱藏的東東。
>>> os.listdir("/home/qw/Documents/VBS/StarterLearningPython/2code/rd") ['b.py', 'c.py'] >>> files = os.listdir("/home/qw/Documents/VBS/StarterLearningPython/2code/rd") >>> for f in files: ... print f ... b.py c.pyimport? os
dir = "E:\\testData\\spark\\spark1.6"
files=os.listdir(dir)
for file in files:
??? print file
??? f = open(dir + "\\" + file,'r')
??? print f.readlines()
??? f.close
os.getcwd, os.chdir:當前工作目錄,改變當前工作目錄
這兩個函數怎么用?惟有通過 help() 看文檔啦。請讀者自行看看。我就不貼出來了,僅演示一個例子:
>>> cwd = os.getcwd() #當前目錄 >>> print cwd /home/qw/Documents/VBS/StarterLearningPython/2code/rd >>> os.chdir(os.pardir) #進入到上一級>>> os.getcwd() #當前 '/home/qw/Documents/VBS/StarterLearningPython/2code'>>> os.chdir("rd") #進入下級>>> os.getcwd() '/home/qw/Documents/VBS/StarterLearningPython/2code/rd'os.pardir 的功能是獲得父級目錄,相當于..
>>> os.pardir '..'os.makedirs, os.removedirs:創建和刪除目錄
廢話少說,路子還是前面那樣,就省略看幫助了,讀者可以自己看。直接上例子:
>>> dir = os.getcwd() >>> dir '/home/qw/Documents/VBS/StarterLearningPython/2code/rd' >>> os.removedirs(dir) Traceback (most recent call last):File "<stdin>", line 1, in <module>File "/usr/lib/python2.7/os.py", line 170, in removedirsrmdir(name) OSError: [Errno 39] Directory not empty: '/home/qw/Documents/VBS/StarterLearningPython/2code/rd'什么時候都不能得意忘形,一定要謙卑。那就是從看文檔開始一點一點地理解。不能像上面那樣,自以為是、貿然行事。看報錯信息,要刪除某個目錄,那個目錄必須是空的。
>>> os.getcwd() '/home/qw/Documents/VBS/StarterLearningPython/2code'這是當前目錄,在這個目錄下再建一個新的子目錄:
>>> os.makedirs("newrd") >>> os.chdir("newrd") >>> os.getcwd() '/home/qw/Documents/VBS/StarterLearningPython/2code/newrd'建立了一個。下面把這個刪除了。這個是空的。
>>> os.listdir(os.getcwd()) [] >>> newdir = os.getcwd() >>> os.removedirs(newdir)按照我的理解,這里應該報錯。因為我是在當前工作目錄刪除當前工作目錄。如果這樣能夠執行,總覺得有點別扭。但事實上,就行得通了。就算是 python 的規定吧。不過,讓我來確定這個功能的話,還是習慣不能在本地刪除本地。
按照上面的操作,在看當前工作目錄:
>>> os.getcwd() Traceback (most recent call last):File "<stdin>", line 1, in <module> OSError: [Errno 2] No such file or directory目錄被刪了,當然沒有啦。只能回到父級。
>>> os.chdir(os.pardir) >>> os.getcwd() '/home/qw/Documents/VBS/StarterLearningPython/2code'有點不可思議。本來沒有當前工作目錄,怎么會有“父級”的呢?但 Python 就是這樣。
補充一點,前面說的如果目錄不空,就不能用 os.removedirs() 刪除。但是,可以用模塊 shutil 的 retree 方法。
>>> os.getcwd() '/home/qw/Documents/VBS/StarterLearningPython/2code' >>> os.chdir("rd") >>> now = os.getcwd() >>> now '/home/qw/Documents/VBS/StarterLearningPython/2code/rd' >>> os.listdir(now) ['b.py', 'c.py'] >>> import shutil >>> shutil.rmtree(now) >>> os.getcwd() Traceback (most recent call last):File "<stdin>", line 1, in <module> OSError: [Errno 2] No such file or directory請讀者注意的是,對于 os.makedirs() 還有這樣的特點:
>>> os.getcwd() '/home/qw/Documents/VBS/StarterLearningPython/2code' >>> d0 = os.getcwd() >>> d1 = d0+"/ndir1/ndir2/ndir3" #這是想建立的目錄,但是中間的 ndir1,ndir2 也都不存在。 >>> d1 '/home/qw/Documents/VBS/StarterLearningPython/2code/ndir1/ndir2/ndir3' >>> os.makedirs(d1) >>> os.chdir(d1) >>> os.getcwd() '/home/qw/Documents/VBS/StarterLearningPython/2code/ndir1/ndir2/ndir3'中間不存在的目錄也被建立起來,直到做右邊的目錄為止。與 os.makedirs() 類似的還有 os.mkdir(),不過,os.mkdir() 沒有上面這個功能,它只能一層一層地建目錄。
os.removedirs() 和 os.rmdir() 也類似,區別也類似上面。
文件和目錄屬性
不管是在什么操作系統,都能看到文件或者目錄的有關屬性,那么,在 os 模塊中,也有這樣的一個方法:os.stat()
>>> p = os.getcwd() #當前目錄 >>> p '/home/qw/Documents/VBS/StarterLearningPython'# 這個目錄的有關信息 >>> os.stat(p) posix.stat_result(st_mode=16895, st_ino=4L, st_dev=26L, st_nlink=1, st_uid=0, st_gid=0, st_size=12288L, st_atime=1430224935, st_mtime=1430224935, st_ctime=1430224935)# 指定一個文件 >>> pf = p + "/README.md" # 此文件的信息 >>> os.stat(pf) posix.stat_result(st_mode=33279, st_ino=67L, st_dev=26L, st_nlink=1, st_uid=0, st_gid=0, st_size=50L, st_atime=1429580969, st_mtime=1429580969, st_ctime=1429580969)從結果中看,可能看不出什么來,先不用著急。這樣的結果是對 computer 姑娘友好的,對讀者可能不友好。如果用下面的方法,就友好多了:
>>> fi = os.stat(pf) >>> mt = fi[8]fi[8] 就是 st_mtime 的值,它代表最后 modified(修改)文件的時間。看結果:
>>> mt 1429580969還是不友好。下面就用 time 模塊來友好一下:
>>> import time >>> time.ctime(mt) 'Tue Apr 21 09:49:29 2015'現在就對讀者友好了。
用 os.stat() 能夠查看文件或者目錄的屬性。如果要修改呢?比如在部署網站的時候,常常要修改目錄或者文件的權限等。這種操作在 Python 的 os 模塊能做到嗎?
要求越來越多了。在一般情況下,不在 Python 里做這個呀。當然,世界是復雜的。肯定有人會用到的,所以 os 模塊提供了 os.chmod()
操作命令
讀者如果使用某種 linux 系統,或者曾經用過 dos(恐怕很少),或者再 windows 里面用過 command,對敲命令都不陌生。通過命令來做事情的確是很酷的。比如,我是在 ubuntu 中,要查看文件和目錄,只需要ls 就足夠了。我并不是否認圖形界面,而是在某些情況下,還是離不開命令的,比如用程序來完成查看文件和目錄的操作。所以,os 模塊中提供了這樣的方法,許可程序員在 Python 程序中使用操作系統的命令。(以下是在 ubuntu 系統,如果讀者是 windows,可以將命令換成 DOS 命令。)
>>> p '/home/qw/Documents/VBS/StarterLearningPython' >>> command = "ls " + p >>> command 'ls /home/qw/Documents/VBS/StarterLearningPython'為了輸入方便,我采用了前面例子中已經有的那個目錄,并且,用拼接字符串的方式,將要輸入的命令(查看某文件夾下的內容)組裝成一個字符串,賦值給變量 command,然后:
>>> os.system(command) 01.md 101.md 105.md 109.md 113.md 117.md 121.md 125.md 129.md 201.md 205.md 209.md 213.md 217.md 221.md index.md 02.md 102.md 106.md 110.md 114.md 118.md 122.md 126.md 130.md 202.md 206.md 210.md 214.md 218.md 222.md n001.md 03.md 103.md 107.md 111.md 115.md 119.md 123.md 127.md 1code 203.md 207.md 211.md 215.md 219.md 2code README.md 0images 104.md 108.md 112.md 116.md 120.md 124.md 128.md images 204.md 208.md 212.md 216.md 220.md images 0這樣就列出來了該目錄下的所有內容。
需要注意的是,os.system() 是在當前進程中執行命令,直到它執行結束。如果需要一個新的進程,可以使用 os.exec 或者os.execvp。對此有興趣詳細了解的讀者,可以查看幫助文檔了解。另外,os.system() 是通過 shell 執行命令,執行結束后將控制權返回到原來的進程,但是os.exec() 及相關的函數,則在執行后不將控制權返回到原繼承,從而使 Python 失去控制。
關于 Python 對進程的管理,此處暫不過多介紹。
os.system() 是一個用途不少的函數。曾有一個朋友網上詢問,用它來啟動瀏覽器。不過,這個操作的確要非常仔細。為什么呢?演示一下就明白了。
>>> os.system("/usr/bin/firefox")(process:4002): GLib-CRITICAL **: g_slice_set_config: assertion 'sys_page_size == 0' failed(firefox:4002): GLib-GObject-WARNING **: Attempt to add property GnomeProgram::sm-connect after class was initialised ......我是在 ubuntu 上操作的,瀏覽器的地址是 /usr/bin/firefox,可是,那個朋友是 windows,他就要非常小心了,因為在 windows 里面,表示路徑的斜杠是跟上面顯示的是反著的,可是在 Python 中\ 這種斜杠代表轉義。解決這個問題可以參看《字符串(1)》的轉義符以及《字符串(2)》的原始字符串講述。比較簡單的一個方法用 r"c:\user\firfox.exe" 的樣式,因為在 r" " 中的,都是被認為原始字符了。還沒完,因為 windows 系統中,一般情況下那個文件不是安裝在我演示的那個簡單樣式的文件夾中,而是C:\Program Files,這中間還有空格,所以還要注意,空格問題。簡直有點暈頭轉向了。讀者按照這些提示,看看能不能完成用 os.system() 啟動 firefox 的操作呢?
凡事感覺麻煩的東西,必然有另外簡單的來替代。于是又有了一個 webbrowser 模塊。可以專門用來打開指定網頁。
>>> import webbrowser >>> webbrowser.open("http://www.itdiffer.com") True不管是什么操作系統,只要如上操作就能打開網頁了。
總結
以上是生活随笔為你收集整理的python学习笔记(十二)标准库os的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python学习笔记(十一)标准库sys
- 下一篇: python学习笔记(十三)标准库hea