一、argparse 模塊
-
參數種類:?? ??? ?? ? 位置參數:參數放在那里,就要對應一個參數位置,例如:/etc?就是對應一個參數位置?? ??? ?? ? 選項參數:必須通過前面是 –?的短選項,或者 —?的長選項,然后后面的才算它的參數,當然短選項后面也可以沒有參數
-
基本解析import argparseparser = argparse.ArgumentParser()? #?獲得一個參數解析器args = parser.parse_args() #?分析參數parser.print_help() # 打印幫助argparse?不僅僅做了參數的定義和解析,還自動幫助生成了幫助信息,尤其是?usage,可以看到現在定義的參數是否是自己想要的
-
解析器的參數?? ??? ?? ? prog:程序的名字,缺省使用?sys.argv[0]?? ??? ?? ? add_help:自動為解析器增加 -h?和 –help?選項,默認為?True?? ??? ?? ? description:為程序功能添加描述parser = argparse.ArgumentParser(prog=’ls’,description=’list directory contents’,add_help=True)
-
位置參數解析?? ??? ?? ? ls?基本功能應該解決目錄內容的打印?? ??? ?? ? 打印的時候應該指定目錄路徑,需要位置參數parser = argparse.ArgumentParser(prog=’ls’,description=’list directory contents’,add_help=True)parser.add_argument(‘path’)args = parser.parse_args() #?分析參數parser.print_help() # 打印幫助運行結果:usage:ls [-h] pathls:error:the following arguments are required:path即 -h?為幫助,可有可無;path?為位置參數,必須提供
-
傳參parse_args(args=None,namespace=None):args?參數列表,一個可迭代對象,內部會把可迭代對象轉換成?list,如果為?None?則使用命令行傳入參數,非?None?則使用?args?參數的可迭代對象import?argparseparser = argparse.ArgumentParser(prog=’ls’,description=’list directory contents’,add_help=True)parser.add_argument(‘path’)? #?位置參數args = parser.parse_args((‘/etc’,))? #?分析參數,同時傳入可迭代的參數print(args)? #?打印名詞空間紅收集的參數parser.print_help() # 打印幫助運行結果:Namespace(path=’/etc’)usage:ls [-h] pathlist directory contentspositional arguments:? ? pathoptional arguments:? ? -h,–help show this help message and exitNamespace(path=’/etc’)?里面的?path?參數存儲在了一個?Namespace?對象內的屬性上,可以通過?Namespace?對象屬性來訪問,例如:args.path
-
非必須位置參數有時候,ls?命令不輸入任何路徑的話就表示列出當前目錄的文件列表import?argparseparser = argparse.ArgumentParser(prog=’ls’,description=’list directory contents’,add_help=True)parser.add_argument(‘path’,nargs=’?’,default=’.’,help=”path help”)? #?位置參數? ? help:表示幫助文檔中的這個參數的描述? ? nargs:表示這個參數接收結果參數,?表示可有可無,+ 表示至少一個,*?可以任意個,數字表示必須是指定數目個? ? default:表示如果不提供該參數,就使用這個值,一般和 ? *?配合,因為它們都可以不提供位置參數,不提供就是用缺省值
二、序列化和反序列化
-
序列化(serialization):將內存中對象存儲下來,把它變成一個個字節? –>?二進制反序列化(deserialization):將文件的一個個字節恢復成內存中的對象? < —?二進制持久化:序列化保存到文件就是持久化,可以將數據序列化后持久化,或者網絡傳輸;也可以將從文件中或者網絡接收到的字節序列反序列化
-
pickle?庫:Python?中的序列化、反序列化模塊?? ?? ? dumps? ?對象序列化為?bytes?對象?? ?? ? dump? ? ?對象序列化到文件對象,就是存入文件?? ?? ? loads? ? ? 從?bytes?對象反序列化?? ?? ? load? ? ? ?對象反序列化,從文件讀取數據
-
import picklefilename = ‘test.txt’d = {‘a’:1,’b’:’abc’,’c’:'[1,2,3]’}l = list(‘123’)i = 99with open(filename,’wb’) as f:????pickle.dump(d,f)????pickle.dump(l,f)????pickle.dump(i,f)with open(filename,’rb’) as f:????print(f.read(),f.seek(0))????for _ in range(3):????????x = pickle.load(f)????????print(type(x),x)class AA:????tttt = ‘ABC’????def show(self):????????print(‘abc’)a1 = AA()sr = pickle.dumps(a1)print(sr)a2 = pickle.loads(sr)print(a2.tttt)a2.show()
b’\x80\x03}q\x00(X\x01\x00\x00\x00bq\x01X\x03\x00\x00\x00abcq\x02X\x01\x00\x00\x00cq\x03X\x07\x00\x00\x00[1,2,3]q\x04X\x01\x00\x00\x00aq\x05K\x01u.\x80\x03]q\x00(X\x01\x00\x00\x001q\x01X\x01\x00\x00\x002q\x02X\x01\x00\x00\x003q\x03e.\x80\x03Kc.’ 0<class ‘dict’> {‘b’: ‘abc’, ‘c’: ‘[1,2,3]’, ‘a’: 1}<class ‘list’> [‘1’, ‘2’, ‘3’]<class ‘int’> 99b’\x80\x03c__main__\nAA\nq\x00)\x81q\x01.’ABCabc上面的例子中,其實就保存了一個類名,因為所有的其他東西都是類定義的東西,是不變的,所以只序列化一個?AA?類名,反序列化的時候找到類就可以恢復一個對象 -
import pickleclass AAA:????def __init__(self):????????self.tttt = ‘abc’a1 = AAA()ser = pickle.dumps(a1)print(ser)a2 = pickle.loads(ser)print(a2,type(a2))print(a2.tttt)print(id(a1),id(a2))
b’\x80\x03c__main__\nAAA\nq\x00)\x81q\x01}q\x02X\x04\x00\x00\x00ttttq\x03X\x03\x00\x00\x00abcq\x04sb.’<__main__.AAA object at 0x7f625c06a390> <class ‘__main__.AAA’>abc140060427461408 140060427461520可以看出這次除了必須保存的AAA,還序列化了?tttt?和?abc,因為這是每一個對象自己的屬性,每一個對象不一樣的,所以這些數據需要序列化序列化、反序列化必須保證使用同一套類的定義,否則會帶來不可預料的結果 -
JSON(JavaScript?Object Notation,JS?對象標記)是一種輕量級的數據交換格式,它基于?ECMAScript(w3c?制定的?JS?規范)的一個子集,采用完全獨立于編程語言的文本格式來存儲和表示數據
-
值:雙引號?引起來的字符串、數值、true?和?false、null、對象、數組,這些都是值字符串:由雙引號包圍起來的任意字符的組合,可以有轉義字符數值:有正負、整數、浮點數對象:無序的鍵值對的集合?? ??? ?? ?格式:{key1:value,….keyn:valuen}?? ??? ?? ?key?必須是一個字符串,需要雙引號包圍這個字符串?? ??? ?? ?value?可以是任意合法的值數組:有序的值得集合,格式:[val1,….valn]
-
Python?支持少量內建數據類型到?Json?類型的轉換Python類型?? ??? ?Json類型True?? ??? ??? ??? ?? ? ?trueFalse?? ??? ??? ??? ?? ? falseNone?? ??? ??? ??? ?? ? nullstr?? ??? ??? ??? ??? ?? ? stringint?? ??? ??? ??? ??? ?? ? integerfloat?? ??? ??? ??? ??? ??floatlist?? ??? ??? ??? ??? ?? ? arraydict?? ??? ??? ??? ??? ?? objectdumps?? ??? ??? ?? ? json編碼dump?? ??? ??? ??? ??json編碼并存入文件loads?? ??? ??? ??? ?? ?json解碼load?? ??? ??? ??? ?? ? ?json解碼,從文件讀取數據
三、正則表達式
-
元字符.? ?? ?? ? ?匹配出換行符外任意一個字符[abc]? ? 字符集合,只能表示一個字符位置,匹配所包含的任意一個字符[^abc]? 字符集合,只能表示一個字符位置,匹配除去集合內字符的任意一個字符[a-z]??? ?字符范圍,是一個集合,表示一個字符位置,匹配所包含的任意一個字符\b??? ??? ?匹配單詞的邊界\B??? ??? ?不匹配單詞的邊界,如 t\B?包含?t?的單詞但是不以?t?結尾的字符,write\d??? ??? ??匹配 [0-9]?中任意一個數字\D??? ??? ?匹配 [0-9]?中任意一個數字\s??? ?? ? ?匹配1位空白字符,包括換行符、制表符、空格\S??? ??? ?匹配一位非空白字符\w??? ??? ?匹配[0-9a-zA-Z_],包括中文的字\W??? ??? ?匹配\w之外的字符
-
轉義:具有特殊意義的符號,如果想使用它的本意,用反斜杠 \?轉義,\r?回車,\n?換行
-
重復*? ? ? ? ?重復 0?次或多次+? ? ? ? 重復至少 1?次?? ? ? ? ?重復 0?次或 1?次{n}? ? ? 重復固定的?n?次{n,}? ? ?重復至少?n?次{n,m}? 重復?n?到?m?次x|y? ? ? 匹配?x?或者?y(pattern)? ? ? ? ? ? ? ? ?使用小括號指定一個子表達式,也叫分組\數字?? ?? ? ?? ?? ? ? ? ? ?匹配對應的分組(?:pattern)? ? ?? ?? ? ??如果僅僅為了改變優先級,就不需要捕獲分組(?P<name>exp)? ???分組捕獲,但是可以通過?name?訪問分組(?=exp)? ?? ??? ??? ??? ?零寬度正預測先行斷言,斷言?exp?一定在匹配的右邊出現(?<=exp)? ?? ?? ? ? ? ??零寬度正回顧后發斷言,斷言?exp?一定出現在匹配的左邊出現(?!exp)??? ? ?? ??? ?? ? ??零寬度負預測先行斷言,斷言?exp?一定不會出現在右側(?<!exp)? ??? ??? ?? ? ??零寬度負回顧后發斷言,斷言?exp?一定不能出現在左側(?#comment)? ?? ???注釋,如:f(?=oo)(?#這個后斷言不捕獲)
-
貪婪與非貪婪:默認是貪婪模式,即盡量多匹配更長的字符串,在重復的符號后面加上一個 ?,就會盡量的少匹配*???? ?? ??? ? ?匹配任意次,但盡可能少重復+???? ?? ???? ?匹配至少 1?次,但盡可能少重復????? ?? ??? ???匹配 0?次或 1?次,但盡可能少重復{n,}??? ??? ? ?匹配至少?n?次,但盡可能少重復{n,m}? ? ? ? ?匹配至少?n?次,至多?m?次,但盡可能少重復
-
引擎選項IgnoreCase?匹配時忽略大小寫,re.ISingleline?單行模式,可以匹配所有字符,包括 \n,re.SMultiline? 多行模式,^行首,$行尾,re.MignorePatternWhitespace? 忽略表達式中的空白字符,如果要使用空白字符,用轉義,#可以做注釋,re.X單行模式就如同看穿了換行符,所有文本就是一個長長的只有一行的字符串,所有 ^?就是這一行字符串的行首,$?就是這一行的行尾多行模式,無法看穿換行符,^ 和 $?還是行首行尾的意思,只不過限于每一行
-
方法編譯:re.compile(pattern,flags=0)?? ??? ?設定?flags,編譯模式,返回正則表達式對象?regex?? ?? ? pattern?就是正則表達式字符串,flags?是選項,正則表達式需要被編譯,為了提高效率,這些編譯后的結果被保存,下次使用同樣的?pattern?的時候,就不需要再次編譯?? ?? ? re?的其它方法為了提高效率都調用了編譯方法,就是為了提高提速單詞匹配:re.match(pattern,string,flag=0)?? ??? ??? ?? ? ?regex.match(string[,pos[,endpos]])?? ??? ??? ?? ? ?match?匹配從字符串的開頭匹配,regex?對象?match方法可以重設定開始位置和結束位置,返回?match?對象,必須從開頭開始,找到一個就不找了,找不到就返回?None?? ??? ??? ?? ? ?re.search(pattern,string.flags=0)?? ??? ??? ??? ??regex.search(string[,pos[,endpos]])?? ??? ??? ?? ? ?match?匹配從字符串的開頭匹配,regex?對象?match?方法可以重設定開始位置和結束位置,返回?match?對象,找到第一個就不找了?? ??? ??? ?? ? ?re.fullmatch(pattern,string.flags=0)?? ??? ??? ?? ? ?regex.fullmatch(string[,pos[,endpos]])?? ??? ??? ??? ??整個字符串和正則表達式匹配,必須是完全匹配,多了少了都不行全文搜索:re.findall(pattern,string,flags=0)?? ??? ??? ??? ??re.findall(string[,pos[,endpos]])?? ??? ??? ?? ? ?對整個字符串,從左至右匹配,返回所有匹配項的列表?? ??? ??? ??? ??re.finditer(pattern,string,flags=0)?? ??? ??? ??? ??regex.finditer(string[,pos[,endpos]])?? ??? ??? ?? ? ?對整個字符串,從左至右匹配,返回所有匹配項,返回迭代器?? ??? ??? ?? ? ?注意每次迭代返回的是?match?對象匹配替換:re.sub(pattern,replacement,string,count=0,flags=0)?? ??? ??? ?? ? ?regex.sub(replacement,string,count=0)?? ??? ??? ?? ? ?使用?pattern?對字符串?string?進行匹配,對匹配項使用?repl?替換?? ??? ??? ?? ? ?replacement?可以是?string、bytes、function?? ??? ??? ?? ? ?re.subn(pattern,replacement,string,count=0,flags=0)?? ??? ??? ?? ? ?regex.subn(replacement,string,count=0)?? ??? ??? ?? ? ?同?sub?返回一個元祖(new_string,number_of_subs_made)分割字符串:re.split(pattern,string,maxsplit=0,flags=0)?? ??? ??? ??? ?? ? 字符串的分割函數太難用,不能指定多個字符進行分割分組:使用小括號的 pattern?捕獲的數據被放到了組?group?中?? ??? ?? ?match、search?函數可以返回?match?對象,findall?返回字符串列表,finditer?返回一個個?match?對象?? ??? ?? ?如果?pattern?中使用了分組,如果有匹配的結果,會在?match?對象中?? ??? ??? ??? ?? ? 1、使用?group(N)?方式返回對應分組,1-N?是對應的分組,0?返回整個匹配的字符串?? ??? ??? ??? ?? ? 2、如果使用了命名分組,可以使用?group(‘name’)?的方式取分組?? ??? ??? ??? ?? ? 3、也可以使用?groups()?返回所有組?? ??? ??? ??? ?? ? 4、使用?groupdict()?返回所有命名的分組
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/97337