標籤:class 無限 bbb 檔案遍曆 highlight sequence size .sh ash
內建模組(不用import就可以直接使用)常用內建函數
help(obj) 線上協助, obj可是任何類型 callable(obj) 查看一個obj是不是可以像函數一樣調用 repr(obj) 得到obj的表示字串,可以利用這個字串eval重建該對象的一個拷貝 eval_r(str) 表示合法的python運算式,返回這個運算式 dir(obj) 查看obj的name space中可見的name hasattr(obj,name) 查看一個obj的name space中是否有name getattr(obj,name) 得到一個obj的name space中的一個name setattr(obj,name,value) 為一個obj的name space中的一個name指向vale這個object delattr(obj,name) 從obj的name space中刪除一個name vars(obj) 返回一個object的name space。用dictionary表示 locals() 返回一個局部name space,用dictionary表示 globals() 返回一個全域name space,用dictionary表示 type(obj) 查看一個obj的類型 isinstance(obj,cls) 查看obj是不是cls的instance issubclass(subcls,supcls) 查看subcls是不是supcls的子類###類型轉換函式 chr(i) 把一個ASCII數值,變成字元 ord(i) 把一個字元或者unicode字元,變成ASCII數值 oct(x) 把整數x變成八進位表示的字串 hex(x) 把整數x變成十六進位表示的字串 str(obj) 得到obj的字串描述 list(seq) 把一個sequence轉換成一個list tuple(seq) 把一個sequence轉換成一個tuple dict(),dict(list) 轉換成一個dictionary int(x) 轉換成一個integer long(x) 轉換成一個long interger float(x) 轉換成一個浮點數 complex(x) 轉換成複數 max(...) 求最大值 min(...) 求最小值###用於執行程式的內建函數 complie 如果一段代碼經常要使用,那麼先編譯,再運行會更快
和作業系統相關的調用系統相關的資訊模組 import sys
sys.argv 是一個list,包含所有的命令列 sys.stdout sys.stdin sys.stderr 分別表示標準輸入輸出,錯誤輸出的檔案對象. sys.stdin.readline() 從標準輸入讀一行 sys.stdout.write("a") 螢幕輸出a sys.exit(exit_code) 退出程式 sys.modules 是一個dictionary,表示系統中所有可用的module sys.platform 得到啟動並執行作業系統環境 sys.path 是一個list,指明所有尋找module,package的路徑.
作業系統相關的調用和操作 import os
os.getcwd() 擷取當前工作目錄,即當前python指令碼工作的目錄路徑 os.chdir("dirname") 改變當前指令碼工作目錄;相當於shell下cd os.curdir 返回目前的目錄: (‘.‘) os.pardir 擷取目前的目錄的父目錄字元串名:(‘..‘) os.makedirs(‘dirname1/dirname2‘) 可產生多層遞迴目錄 os.removedirs(‘dirname1‘) 若目錄為空白,則刪除,並遞迴到上一級目錄,如若也為空白,則刪除,依此類推 os.mkdir(‘dirname‘) 產生單級目錄;相當於shell中mkdir dirname os.rmdir(‘dirname‘) 刪除單級空目錄,若目錄不為空白則無法刪除,報錯;相當於shell中rmdir dirname os.listdir(‘dirname‘) 列出指定目錄下的所有檔案和子目錄,包括隱藏檔案,並以列表方式列印 os.remove() 刪除一個檔案 os.rename("oldname","newname") 重新命名檔案/目錄 os.stat(‘path/filename‘) 擷取檔案/目錄資訊 os.symlink(‘path/filename‘,‘ln_filename‘) 建立符號連結,源需絕對路徑 os.utime() 修改時間屬性 >>> import os >>> stinfo = os.stat(‘c.py‘) >>> print "access time of c.py: %s \nmodified time of c.py: %s" % (stinfo.st_atime,stinfo.st_mtime) access time of c.py: 1375448908.0 modified time of c.py: 1369735909.0 >>> os.utime(‘c.py‘,(1375448978,1369735977)) >>> print "access time of c.py: %s \nmodified time of c.py: %s" % (stinfo.st_atime,stinfo.st_mtime) access time of c.py: 1375448908.0 modified time of c.py: 1369735909.0 退出Python互動模式,再次進入 >>> import os >>> stinfo = os.stat(‘c.py‘) >>> print "access time of c.py: %s \nmodified time of c.py: %s" % (stinfo.st_atime,stinfo.st_mtime) access time of c.py: 1375448978.0 modified time of c.py: 1369735977.0 os.walk() 產生一個分類樹下的所有檔案名稱 os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]]) top表示需要遍曆的分類樹的路徑topdown的預設值是”True”,表示首先返回分類樹下的檔案,然後在遍曆分類樹的子目錄.Topdown的值為”False”時,則表示先遍曆分類樹的子目錄,返回子目錄下的檔案,最後返回根目錄下的檔案onerror的預設值是”None”,表示忽略檔案遍曆時產生的錯誤.如果不為空白,則提供一個自訂函數提示錯誤資訊後繼續遍曆或拋出異常中止遍曆該函數返回一個元組,該元組有3個元素,這3個元素分別表示每次遍曆的路徑名,目錄列表和檔案清單 >>> import os >>> for root, dirs, files in os.walk("wd/chat", topdown=False): ... for name in files: ... print(os.path.join(root, name)) #列印檔案絕對路徑 ... for name in dirs: ... print(os.path.join(root, name)) #列印目錄絕對路徑 ... os.tmpfile() 建立並開啟‘w+b一個新的臨時檔案 os.sep 輸出作業系統特定的路徑分隔字元,win下為"\\",Linux下為"/" os.linesep 輸出當前平台使用的行終止符,win下為"\t\n",Linux下為"\n" os.pathsep 輸出用於分割檔案路徑的字串 os.name 輸出字串指示當前使用平台。win->‘nt‘; Linux->‘posix‘ os.system("bash command") 運行shell命令,直接顯示 os.popen("bash command") 運行shell命令,產生對象,可賦給變數,再用read讀取 >>> import os >>> os.system(‘ls twisted‘) chat_client_twisted.py chat_server_twisted.py 0 >>> LS = os.popen(‘ls twisted‘) >>> LS.readlines() [‘chat_client_twisted.py\n‘, ‘chat_server_twisted.py\n‘] os.environ 擷取系統內容變數 os.access(‘pathfile‘,os.W_OK) 檢驗檔案許可權模式,輸出True,False os.chmod(‘pathfile‘,os.W_OK) 改變檔案許可權模式 # echo ‘test‘ > test.sh >>> os.access(‘test.sh‘,os.W_OK) True >>> os.access(‘test.sh‘,os.X_OK) False >>> os.chmod(‘test.sh‘,os.X_OK) >>> os.access(‘test.sh‘,os.X_OK) True # ls -l test.sh ---------x 1 root root 12 Oct 20 23:03 test.sh =============================================== os.environ 一個dictionary 包含環境變數的映射關係 os.environ["HOME"] 可以得到環境變數HOME的值 os.chdir(dir) 改變目前的目錄 os.chdir(‘d:\\outlook‘) 注意windows下用到轉義 os.getcwd() 得到目前的目錄 os.getegid() 得到有效組id os.getgid() 得到組id os.getuid() 得到使用者id os.geteuid() 得到有效使用者id os.setegid os.setegid() os.seteuid() os.setuid() os.getgruops() 得到使用者組名稱列表 os.getlogin() 得到使用者登入名稱稱 os.getenv 得到環境變數 os.putenv 設定環境變數 os.umask 設定umask os.system(cmd) 利用系統調用,運行cmd命令 os.system("echo ‘hello‘ > /tmp/xx/a.txt") os.mkdir(‘/tmp/xx‘) 建立一個目錄 os.listdir(‘/tmp/xx‘) 列出目錄中的目錄和檔案 os.rename(‘/tmp/xx/a.txt‘,‘/tmp/xx/b.txt‘) 重新命名 os.remove(‘/tmp/xx/b.txt‘) 刪除檔案 os.rmdir(‘/tmp/xx‘) 刪除目錄###用os.path編寫平台無關的程式 os.path.abspath(path) 返回path正常化的絕對路徑 >>> import os.path >>> os.path.abspath(‘c.py‘) ‘/root/py/c.py‘ >>> os.path.abspath(‘../py/c.py‘) ‘/root/py/c.py‘ os.path.split(path) 將path分割成目錄和檔案名稱二元組返回 >>> os.path.split(‘/root/py/c.py‘) (‘/root/py‘, ‘c.py‘) >>> os.path.split(‘/root/py/‘) (‘/root/py‘, ‘‘) os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素 >>> os.path.dirname(‘/root/py/c.py‘) ‘/root/py‘ >>> os.path.dirname(‘c.py‘) ‘‘ os.path.basename(path) 返回path最後的檔案名稱。如何path以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素 >>> os.path.basename(‘/root/py/c.py‘) ‘c.py‘ >>> os.path.basename(‘/root/py‘) ‘py‘ os.path.commonprefix(list) 返回list中,所有path共有的最長的路徑,從左向右,相同字元 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False os.path.isabs(path) 如果path是絕對路徑,返回True os.path.isfile(path) 如果path是一個存在的檔案,返回True。否則返回False os.path.isdir(path) 如果path是一個存在的目錄,則返回True。否則返回False os.path.join(path1[, path2[, ...]]) 將多個路徑組合後返回,第一個絕對路徑之前的參數將被忽略 os.path.normcase(path) 在Linux下,該函數會原樣返回path,在windows平台上會將路徑中所有字元轉換為小寫,並將所有斜杠轉換為反斜線 >>> os.path.normcase(‘c:/windows\\system32\\‘) ‘c:\\windows\\system32\\‘ os.path.normpath(path) 正常化路徑 >>> os.path.normpath(‘c://windows\\System32\\../Temp/‘) ‘c:\\windows\\Temp‘ os.path.splitdrive(path) 拆分磁碟機名和路徑,主要對win,對linux元組第一個總是空的 >>> os.path.splitdrive(‘c:\\windows‘) (‘c:‘, ‘\\windows‘) os.path.splitext(path) 分離檔案名稱與副檔名;預設返回(fname,fextension)元組,可做分區操作 ,以“.”為分隔字元 >>> os.path.splitext(‘/root/py/c.py‘) (‘/root/py/c‘, ‘.py‘) os.path.getsize(path) 返回path的大小(位元組) os.path.getatime(path) 返回path所指向的檔案或者目錄的最後存取時間 os.path.getmtime(path) 返回path所指向的檔案或者目錄的最後修改時間 os.path.walk(top,func,arg) top表示需要遍曆的分類樹的路徑func表示回呼函數,對遍曆路徑進行處理.所謂回呼函數,是作為某個函數的參數使用,當某個時間觸發時,程式將調用定義好的回呼函數處理某個任務.回呼函數必須提供3個參數:第1個參數為walk()的參數tag,第2個參數表示目錄列表,第3個參數表示檔案清單arg是傳遞給回調參數func的元組.回呼函數的一個參數必須是arg,為回呼函數提供處理參數.參數arg可以為空白 >>> import os >>> def VisitDir(arg,dirname,names): ... for filespath in names: ... print os.path.join(dirname,filespath) ... >>> path=‘/root/py/wd/chat‘ >>> os.path.walk(path,VisitDir,()) /root/py/wd/chat/chat_server.py /root/py/wd/chat/chat_client.py /root/py/wd/chat/test /root/py/wd/chat/test/linuxeye /root/py/wd/chat/test/test2 /root/py/wd/chat/test/test3 /root/py/wd/chat/test/test2/asdf /root/py/wd/chat/test/test3/sdfaxx os.path.walk()與os.walk()產生的檔案名稱列表並不相同。os.path.walk()產生分類樹下的目錄路徑和檔案路徑,而os.walk()只產生檔案路徑 ========================================= os.path.abspath("1.txt") == os.path.join(os.getcwd(), "1.txt") os.path.split(os.getcwd()) 用於分開一個目錄名稱中的目錄部分和檔案名稱部分。 os.path.join(os.getcwd(), os.pardir, ‘a‘, ‘a.doc‘) 全成路徑名稱. os.pardir 表示當前平台下上一級目錄的字元 .. os.path.getctime("/root/1.txt") 返回1.txt的ctime(建立時間)時間戳記 os.path.exists(os.getcwd()) 判斷檔案是否存在 os.path.expanduser(‘~/dir‘) 把~擴充成使用者根目錄 os.path.expandvars(‘$PATH‘) 擴充環境變數PATH os.path.isfile(os.getcwd()) 判斷是否是檔案名稱,1是0否 os.path.isdir(‘c:\Python26\temp‘) 判斷是否是目錄,1是0否 os.path.islink(‘/home/huaying/111.sql‘) 是否是符號串連 windows下不可用 os.path.ismout(os.getcwd()) 是否是檔案系統安裝點 windows下不可用 os.path.samefile(os.getcwd(), ‘/home/huaying‘) 看看兩個檔案名稱是不是指的是同一個檔案 os.path.walk(‘/home/flying‘, test_fun, "a.c") 遍曆/home/flying下所有子目錄包括本目錄,對於每個目錄都會調用函數test_fun 例:在某個目錄中,和他所有的子目錄中尋找名稱是a.c的檔案或目錄: def test_fun(filename, dirname, names): //filename即是walk中的a.c dirname是訪問的目錄名稱 if filename in names: //names是一個list,包含dirname目錄下的所有內容 print os.path.join(dirname, filename) os.path.walk(‘/home/flying‘, test_fun, "a.c")##檔案操作###開啟檔案 f = open("filename", "r") r唯讀 w寫 rw讀寫 rb讀二進位 wb寫二進位 w+寫追加###讀寫檔案 f.write("a") f.write(str) 寫一字串 f.writeline() f.readlines() 與下read類同 f.read() 全讀出來 f.read(size) 表示從檔案中讀取size個字元 f.readline() 讀一行,到檔案結尾,返回空串. f.readlines() 讀取全部,返回一個list. list每個元素表示一行,包含"\n" f.tell() 返回當前檔案讀取位置 f.seek(off, where) 定位檔案讀寫位置. off表示位移量,正數向檔案尾移動,負數表示向開頭移動。where為0表示從開始算起,1表示從當前位置算,2表示從結尾算. f.flush() 重新整理緩衝###關閉檔案 f.close()##Regex import re###簡單的regexp p = re.compile("abc") if p.match("abc") : print "match" 上例中首先產生一個pattern(模式),如果和某個字串匹配,就返回一個match object 除某些特殊字元metacharacter元字元,大多數字元都和自身匹配。這些特殊字元是 。^ $ * + ? { [ ] \ | ( )###字元集合(用[]表示) 列出字元,如[abc]表示匹配a或b或c,大多數metacharacter在[]中只表示和本身匹配。例: a = ".^$*+?{\\|()" 大多數metachar在[]中都和本身匹配,但"^[]\"不同 p = re.compile("["+a+"]") for i in a: if p.match(i): print "[%s] is match" %i else: print "[%s] is not match" %i 在[]中包含[]本身,表示"["或者"]"匹配,用\[和\]表示。 ^出現在[]的開頭,表示取反,[^abc]表示除了a,b,c之外的所有字元,^沒有出現在開頭,即於身身匹配。-可表示範圍.[a-zA-Z]匹配任何一個英文字母。[0-9]匹配任何數字。 \在[]中的妙用。 \d [0-9] \D [^0-9] \s [ \t\n\r\f\v] \S [^ \t\n\r\f\v] \w [a-zA-Z0-9_] \W [^a-zA-Z0-9_] \t 表示和tab匹配, 其他的都和字串的標記法一致 \x20 表示和十六進位ascii 0x20匹配 有了\,可以在[]中表示任何字元。註:單獨的一個"."如果沒有出現[]中,表示出了換行\n以外的匹配任何字元,類似[^\n].###regexp的重複 {m,n}表示出現m個以上(含m個),n個以下(含n個). 如ab{1,3}c和abc,abbc,abbbc匹配,不會與ac,abbbc匹配。m是下界,n是上界。m省略表下界是0,n省略,表上界無限大。*表示{,} +表示{1,} ?表示{0,1} 最大匹配和最小匹配 python都是最大匹配,如果要最小匹配,在*,+,?,{m,n}後面加一個?. match object的end可以得到匹配的最後一個字元的位置。 re.compile("a*").match(‘aaaa‘).end() 4 最大匹配 re.compile("a*?").match(‘aaaa‘).end() 0 最小匹配###使用原始字串 字串表示方法中用\\表示字元\.大量使用影響可讀性。 解決方案:在字串前面加一個r表示raw格式。 a = r"\a" print a 結果是\a a = r"\"a" print a 結果是\"a###使用re模組 先用re.compile得到一個RegexObject 表示一個regexp 後用pattern的match,search的方法,得到MatchObject 再用match object得到匹配的位置,匹配的字串等資訊###RegxObject常用函數: >>> re.compile("a").match("abab") 如果abab的開頭和re.compile("a")匹配,得到MatchObject <_sre.SRE_Match object at 0x81d43c8> >>> print re.compile("a").match("bbab") None 註:從str的開頭開始匹配 >>> re.compile("a").search("abab") 在abab中搜尋第一個和re_obj匹配的部分 <_sre.SRE_Match object at 0x81d43c8> >>> print re.compile("a").search("bbab") <_sre.SRE_Match object at 0x8184e18> 和match()不同,不必從開頭匹配 re_obj.findall(str) 返回str中搜尋所有和re_obj匹配的部分. 返回一個tuple,其中元素是匹配的字串.###MatchObject的常用函數 m.start() 返回起始位置, m.end()返回結束位置(不包含該位置的字元). m.span() 返回一個tuple表示(m.start(), m.end()) m.pos(), m.endpos(), m.re(), m.string() m.re().search(m.string(), m.pos(), m.endpos()) 會得到m本身 m.finditer()可以返回一個iterator,用來遍曆所有找到的MatchObject. for m in re.compile("[ab]").finditer("tatbxaxb"): print m.span()###進階regexp | 表示聯合多個regexp. A B兩個regexp,A|B表示和A匹配或者跟B匹配. ^ 表示只匹配一行的開始行首,^只有在開頭才有此特殊意義。 $ 表示只匹配一行的結尾\A 表示只匹配第一行字串的開頭 ^匹配每一行的行首\Z 表示只匹配行一行字串的結尾 $匹配第一行的行尾 \b 只匹配詞的邊界 例:\binfo\b 只會匹配"info" 不會匹配information \B 表示匹配非單詞邊界###例子 >>> print re.compile(r"\binfo\b").match("info ") #使用raw格式 \b表示單詞邊界 <_sre.SRE_Match object at 0x817aa98> >>> print re.compile("\binfo\b").match("info ") #沒有使用raw \b表示退格符號 None >>> print re.compile("\binfo\b").match("\binfo\b ") <_sre.SRE_Match object at 0x8174948>分組(Group) 樣本
re.compile("(a(b)c)d").match("abcd").groups() #(‘abc‘, ‘b‘) #!/usr/local/bin/python import re x = """name: CharlesAddress: BUPTname: AnnAddress: BUPT""" #p = re.compile(r"^name:(.*)\n^Address:(.*)\n", re.M)p = re.compile(r"^name:(?P<name>.*)\n^Address:(?P<address>.*)\n", re.M)for m in p.finditer(x): print m.span() print "here is your friends list" print "%s, %s"%m.groups()Compile Flag
用re.compile得到RegxObject時,可以有一些flag用來調整RegxObject的詳細特徵. DOTALL, S 讓.匹配任一字元,包括分行符號\n IGNORECASE, I 忽略大小寫 LOCALES, L 讓\w \W \b \B和當前的locale一致 MULTILINE, M 多行模式,隻影響^和$(參見上例) VERBOSE, X verbose模式
python 常用模組