1、時間模塊node
在Python中,一般有這幾種方式來表示時間:python
1 import time 2 #--------------------------咱們先以當前時間爲準,讓你們快速認識三種形式的時間 3 print(time.time()) # 時間戳:1487130156.419527 4 print(time.strftime("%Y-%m-%d %X")) #格式化的時間字符串:'2017-02-15 11:40:53' 5 6 print(time.localtime()) #本地時區的struct_time 7 print(time.gmtime()) #UTC時區的struct_time
1 import time 2 #時間戳 3 # print(time.time()) 4 5 #結構化的時間 6 # print(time.localtime()) 7 # print(time.localtime().tm_year) 8 # print(time.gmtime()) 9 10 #格式化的字符串 11 # print(time.strftime('%Y-%m-%d %H:%M:%S')) 12 # print(time.strftime('%Y-%m-%d %X'))
1 #--------------------------按圖1轉換時間 2 # localtime([secs]) 3 # 將一個時間戳轉換爲當前時區的struct_time。secs參數未提供,則以當前時間爲準。 4 time.localtime() 5 time.localtime(1473525444.037215) 6 7 # gmtime([secs]) 和localtime()方法相似,gmtime()方法是將一個時間戳轉換爲UTC時區(0時區)的struct_time。 8 9 # mktime(t) : 將一個struct_time轉化爲時間戳。 10 print(time.mktime(time.localtime()))#1473525749.0 11 12 13 # strftime(format[, t]) : 把一個表明時間的元組或者struct_time(如由time.localtime()和 14 # time.gmtime()返回)轉化爲格式化的時間字符串。若是t未指定,將傳入time.localtime()。若是元組中任何一個 15 # 元素越界,ValueError的錯誤將會被拋出。 16 print(time.strftime("%Y-%m-%d %X", time.localtime()))#2016-09-11 00:49:56 17 18 # time.strptime(string[, format]) 19 # 把一個格式化時間字符串轉化爲struct_time。實際上它和strftime()是逆操做。 20 print(time.strptime('2011-05-05 16:37:06', '%Y-%m-%d %X')) 21 #time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=16, tm_min=37, tm_sec=6, 22 # tm_wday=3, tm_yday=125, tm_isdst=-1) 23 #在這個函數中,format默認爲:"%a %b %d %H:%M:%S %Y"。
1 #--------------------------按圖2轉換時間 2 # asctime([t]) : 把一個表示時間的元組或者struct_time表示爲這種形式:'Sun Jun 20 23:21:05 1993'。 3 # 若是沒有參數,將會將time.localtime()做爲參數傳入。 4 print(time.asctime())#Sun Sep 11 00:43:43 2016 5 6 # ctime([secs]) : 把一個時間戳(按秒計算的浮點數)轉化爲time.asctime()的形式。若是參數未給或者爲 7 # None的時候,將會默認time.time()爲參數。它的做用至關於time.asctime(time.localtime(secs))。 8 print(time.ctime()) # Sun Sep 11 00:46:38 2016 9 print(time.ctime(time.time())) # Sun Sep 11 00:46:38 2016
1 #--------------------------其餘用法 2 # sleep(secs) 3 # 線程推遲指定的時間運行,單位爲秒。
2、random模塊mysql
1 import random 2 3 print(random.random())#(0,1)----float 大於0且小於1之間的小數 4 5 print(random.randint(1,3)) #[1,3] 大於等於1且小於等於3之間的整數 6 7 print(random.randrange(1,3)) #[1,3) 大於等於1且小於3之間的整數 8 9 print(random.choice([1,'23',[4,5]]))#1或者23或者[4,5] 10 11 print(random.sample([1,'23',[4,5]],2))#列表元素任意2個組合 12 13 print(random.uniform(1,3))#大於1小於3的小數,如1.927109612082716 14 15 16 item=[1,3,5,7,9] 17 random.shuffle(item) #打亂item的順序,至關於"洗牌" 18 print(item)
其餘應用場景:web
一、爬蟲更換IP算法
1 import random 2 proxy_ip=[ 3 '1.1.1.1', 4 '1.1.1.2', 5 '1.1.1.3', 6 '1.1.1.4', 7 ] 8 9 print(random.choice(proxy_ip))
二、驗證碼sql
1 def v_code(n=5): 2 res='' 3 for i in range(n): 4 num=random.randint(0,9) 5 s=chr(random.randint(65,90)) 6 add=random.choice([num,s]) 7 res+=str(add) 8 return res 9 10 print(v_code(6))
3、OS模塊shell
os模塊是與操做系統交互的一個接口。編程
os模塊經常使用的屬性:json
1 os.getcwd() 獲取當前工做目錄,即當前python腳本工做的目錄路徑 2 os.chdir("dirname") 改變當前腳本工做目錄;至關於shell下cd 3 os.curdir 返回當前目錄: ('.') 4 os.pardir 獲取當前目錄的父目錄字符串名:('..') 5 os.makedirs('dirname1/dirname2') 可生成多層遞歸目錄 6 os.removedirs('dirname1') 若目錄爲空,則刪除,並遞歸到上一級目錄,如若也爲空,則刪除,依此類推 7 os.mkdir('dirname') 生成單級目錄;至關於shell中mkdir dirname 8 os.rmdir('dirname') 刪除單級空目錄,若目錄不爲空則沒法刪除,報錯;至關於shell中rmdir dirname 9 os.listdir('dirname') 列出指定目錄下的全部文件和子目錄,包括隱藏文件,並以列表方式打印 10 os.remove() 刪除一個文件 11 os.rename("oldname","newname") 重命名文件/目錄 12 os.stat('path/filename') 獲取文件/目錄信息 13 os.sep 輸出操做系統特定的路徑分隔符,win下爲"\\",Linux下爲"/" 14 os.linesep 輸出當前平臺使用的行終止符,win下爲"\t\n",Linux下爲"\n" 15 os.pathsep 輸出用於分割文件路徑的字符串 win下爲;,Linux下爲: 16 os.name 輸出字符串指示當前使用平臺。win->'nt'; Linux->'posix' 17 os.system("bash command") 運行shell命令,直接顯示 18 os.environ 獲取系統環境變量 19 os.path.abspath(path) 返回path規範化的絕對路徑 20 os.path.split(path) 將path分割成目錄和文件名二元組返回 21 os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素 22 os.path.basename(path) 返回path最後的文件名。如何path以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素 23 os.path.exists(path) 若是path存在,返回True;若是path不存在,返回False 24 os.path.isabs(path) 若是path是絕對路徑,返回True 25 os.path.isfile(path) 若是path是一個存在的文件,返回True。不然返回False 26 os.path.isdir(path) 若是path是一個存在的目錄,則返回True。不然返回False 27 os.path.join(path1[, path2[, ...]]) 將多個路徑組合後返回,第一個絕對路徑以前的參數將被忽略 28 os.path.getatime(path) 返回path所指向的文件或者目錄的最後存取時間 29 os.path.getmtime(path) 返回path所指向的文件或者目錄的最後修改時間 30 os.path.getsize(path) 返回path的大小
1 在Linux和Mac平臺上,該函數會原樣返回path,在windows平臺上會將路徑中全部字符轉換爲小寫,並將全部斜槓轉換爲飯斜槓。 2 >>> os.path.normcase('c:/windows\\system32\\') 3 'c:\\windows\\system32\\' 4 5 6 規範化路徑,如..和/ 7 >>> os.path.normpath('c://windows\\System32\\../Temp/') 8 'c:\\windows\\Temp' 9 10 >>> a='/Users/jieli/test1/\\\a1/\\\\aa.py/../..' 11 >>> print(os.path.normpath(a)) 12 /Users/jieli/test1
主要應用方式windows
1 os路徑處理 2 #方式一:推薦使用 3 import os 4 #具體應用 5 import os,sys 6 possible_topdir = os.path.normpath(os.path.join( 7 os.path.abspath(__file__), 8 os.pardir, #上一級 9 os.pardir, 10 os.pardir 11 )) 12 sys.path.insert(0,possible_topdir) 13 14 15 #方式二:不推薦使用 16 os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
4、sys模塊
1 sys.argv 命令行參數List,第一個元素是程序自己路徑 2 sys.exit(n) 退出程序,正常退出時exit(0) 3 sys.version 獲取Python解釋程序的版本信息 4 sys.maxint 最大的Int值 5 sys.path 返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值 6 sys.platform 返回操做系統平臺名稱
1 進度條 2 3 import sys,time 4 5 for i in range(50): 6 sys.stdout.write('%s\r' %('#'*i)) 7 sys.stdout.flush() 8 time.sleep(0.1) 9 10 ''' 11 注意:在pycharm中執行無效,請到命令行中以腳本的方式執行 12 '''
5、shutil模塊
shutil模塊是高級的文件、文件夾、壓縮包處理模塊。
一、將文件內容拷貝到另外一個文件中-shutil.copyfileobj(fsrc, fdst[, length])
1 import shutil 2 shutil.copyfileobj(open('test.py','r'),open('test1.py','w'))
二、拷貝文件-shutil.copyfile(src, dst)
shutil.copyfile('test1.py','test2.py') #目標文件無需存在
三、僅拷貝權限。內容、組、用戶均不變-shutil.copymode(src, dst)
1 shutil.copymode('f1.log', 'f2.log') #目標文件必須存在
四、僅拷貝狀態的信息,包括:mode bits, atime, mtime, flags-shutil.copystat(src, dst)
1 shutil.copystat('f1.log', 'f2.log') #目標文件必須存在
五、拷貝文件和權限-shutil.copy(src, dst)
1 shutil.copy('f1.log', 'f2.log')
六、拷貝文件和狀態信息-shutil.copy2(src, dst)
1 shutil.copy2('f1.log', 'f2.log')
七、遞歸的去拷貝文件夾
-shutil.ignore_patterns(*patterns)
-shutil.copytree(src, dst, symlinks=False, ignore=None)
1 shutil.copytree('folder1','folder2',ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) #目標目錄不能存在,注意對folder2目錄父級目錄要有可寫權限,ignore的意思是排除 2 3 4 5 shutil.copytree('f1', 'f2', symlinks=True, ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) 6 7 ''' 8 一般的拷貝都把軟鏈接拷貝成硬連接,即對待軟鏈接來講,建立新的文件 9 '''
八、遞歸的去刪除文件-shutil.rmtree(path[, ignore_errors[, onerror]])
1 shutil.rmtree('folder1')
九、遞歸的去移動文件,它相似mv命令,其實就是重命名-
1 shutil.move('folder1', 'folder3')
十、建立壓縮包並返回文件路徑,例如:zip、tar-shutil.make_archive(base_name, format,...)
base_name: 壓縮包的文件名,也能夠是壓縮包的路徑。只是文件名時,則保存至當前目錄,不然保存至指定路徑, 如 data_bak =>保存至當前路徑 如:/tmp/data_bak =>保存至/tmp/ format: 壓縮包種類,「zip」, 「tar」, 「bztar」,「gztar」 root_dir: 要壓縮的文件夾路徑(默認當前目錄) owner: 用戶,默認當前用戶 group: 組,默認當前組 logger: 用於記錄日誌,一般是logging.Logger對象
1 #將 /data 下的文件打包放置當前程序目錄 2 import shutil 3 ret = shutil.make_archive("data_bak", 'gztar', root_dir='/data') 4 5 6 #將 /data下的文件打包放置 /tmp/目錄 7 import shutil 8 ret = shutil.make_archive("/tmp/data_bak", 'gztar', root_dir='/data')
shutil 對壓縮包的處理是調用 ZipFile 和 TarFile 兩個模塊來進行的,詳細:
1 import zipfile 2 3 # 壓縮 4 z = zipfile.ZipFile('laxi.zip', 'w') 5 z.write('a.log') 6 z.write('data.data') 7 z.close() 8 9 # 解壓 10 z = zipfile.ZipFile('laxi.zip', 'r') 11 z.extractall(path='.') 12 z.close() 13 14 zipfile壓縮解壓縮
1 import tarfile 2 3 # 壓縮 4 >>> t=tarfile.open('/tmp/egon.tar','w') 5 >>> t.add('/test1/a.py',arcname='a.bak') 6 >>> t.add('/test1/b.py',arcname='b.bak') 7 >>> t.close() 8 9 10 # 解壓 11 >>> t=tarfile.open('/tmp/egon.tar','r') 12 >>> t.extractall('/egon') 13 >>> t.close() 14 15 tarfile壓縮解壓縮
6、json和pickle模塊
以前咱們學習過用eval內置方法能夠將一個字符串轉成python對象,不過,eval方法是有侷限性的,對於普通的數據類型,json.loads和eval都能用,但遇到特殊類型的時候,eval就無論用了,因此eval的重點仍是一般用來執行一個字符串表達式,並返回表達式的值。
1 import json 2 x="[null,true,false,1]" 3 print(eval(x)) #報錯,沒法解析null類型,而json就能夠 4 print(json.loads(x))
一、什麼是序列化?
咱們把對象(變量)從內存中變成可存儲或傳輸的過程稱之爲序列化,在Python中叫pickling,在其餘語言中也被稱之爲serialization,marshalling,flattening等等,都是一個意思。
二、爲何要用序列化?
1):持久保存狀態
需知一個軟件/程序的執行就在處理一系列狀態的變化,在編程語言中,'狀態'會以各類各樣有結構的數據類型(也可簡單的理解爲變量)的形式被保存在內存中。
內存是沒法永久保存數據的,當程序運行了一段時間,咱們斷電或者重啓程序,內存中關於這個程序的以前一段時間的數據(有結構)都被清空了。
在斷電或重啓程序以前將程序當前內存中全部的數據都保存下來(保存到文件中),以便於下次程序執行可以從文件中載入以前的數據,而後繼續執行,這就是序列化。
具體的來講,你玩使命召喚闖到了第13關,你保存遊戲狀態,關機走人,下次再玩,還能從上次的位置開始繼續闖關。或如,虛擬機狀態的掛起等。
2):跨平臺數據交互
序列化以後,不只能夠把序列化後的內容寫入磁盤,還能夠經過網絡傳輸到別的機器上,若是收發的雙方約定好實用一種序列化的格式,那麼便打破了平臺/語言差別化帶來的限制,實現了跨平臺數據交互。
反過來,把變量內容從序列化的對象從新讀到內存裏稱之爲反序列化,即unpickling
序列化-json和pickle
1 json
若是咱們要在不一樣的編程語言之間傳遞對象,就必須把對象序列化爲標準格式,好比XML,但更好的方法是序列化爲JSON,由於JSON表示出來就是一個字符串,能夠被全部語言讀取,也能夠方便地存儲到磁盤或者經過網絡傳輸。JSON不只是標準格式,而且比XML更快,並且能夠直接在Web頁面中讀取,很是方便。
json表示的對象就是標準的JavaScript語言的對象,JSON和Python內置的數據類型對應以下:
1 import json 2 #序列化的過程:dic---->res=json.dumps(dic)---->f.write(res) 3 dic={ 4 'name':'alex', 5 'age':9000, 6 'height':'150cm', 7 } 8 9 res=json.dumps(dic) 10 print(res,type(res)) 11 with open('a.json','w') as f: 12 f.write(res) 13 14 # ============================== 15 16 import json 17 #反序列化的過程:res=f.read()---->res=json.loads(res)---->dic=res 18 with open('a.json','r') as f: 19 dic=json.loads(f.read()) 20 print(dic,type(dic)) 21 print(dic['name']) 22 23 24 #json的便捷操做 25 import json 26 dic={ 27 'name':'alex', 28 'age':9000, 29 'height':'150cm', 30 } 31 json.dump(dic,open('b.json','w'))
Ps注意:
1 import json 2 #dct="{'1':111}"#json 不認單引號 3 #dct=str({"1":111})#報錯,由於生成的數據仍是單引號:{'one': 1} 4 5 dct='{"1":"111"}' 6 print(json.loads(dct)) 7 8 #conclusion: 9 # 不管數據是怎樣建立的,只要知足json格式,就能夠json.loads出來,不必定非要dumps的數據才能loads
2 pickle
1 import pickle 2 3 dic={'name':'alvin','age':23,'sex':'male'} 4 5 print(type(dic))#<class 'dict'> 6 7 j=pickle.dumps(dic) 8 print(type(j))#<class 'bytes'> 9 10 11 f=open('序列化對象_pickle','wb')#注意是w是寫入str,wb是寫入bytes,j是'bytes' 12 f.write(j) #-------------------等價於pickle.dump(dic,f) 13 14 f.close() 15 #-------------------------反序列化 16 import pickle 17 f=open('序列化對象_pickle','rb') 18 19 data=pickle.loads(f.read())# 等價於data=pickle.load(f) 20 21 22 print(data['age'])
Pickle的問題和全部其餘編程語言特有的序列化問題同樣,就是它只能用於Python,而且可能不一樣版本的Python彼此都不兼容,所以,只能用Pickle保存那些不重要的數據,不能成功地反序列化也不要緊
7、shelve模塊
shelve模塊比pickle模塊簡單,只有一個open函數,返回相似字典的對象,可讀可寫;key必須爲字符串,而值能夠是python所支持的數據類型。
1 import shelve 2 3 f=shelve.open(r'sheve.txt') 4 # f['stu1_info']={'name':'egon','age':18,'hobby':['piao','smoking','drinking']} 5 # f['stu2_info']={'name':'gangdan','age':53} 6 # f['school_info']={'website':'http://www.pypy.org','city':'beijing'} 7 8 print(f['stu1_info']['hobby']) 9 f.close()
8、xml模塊
xml是實現不一樣語言或程序之間進行數據交換的協議,跟json差很少,但json使用起來更簡單,不過,古時候,在json還沒誕生的黑暗年代,你們只能選擇用xml呀,至今不少傳統公司如金融行業的不少系統的接口還主要是xml。
xml的格式以下,就是經過<>節點來區別數據結構的:
<?xml version="1.0"?> <data> <country name="Liechtenstein"> <rank updated="yes">2</rank> <year>2008</year> <gdppc>141100</gdppc> <neighbor name="Austria" direction="E"/> <neighbor name="Switzerland" direction="W"/> </country> <country name="Singapore"> <rank updated="yes">5</rank> <year>2011</year> <gdppc>59900</gdppc> <neighbor name="Malaysia" direction="N"/> </country> <country name="Panama"> <rank updated="yes">69</rank> <year>2011</year> <gdppc>13600</gdppc> <neighbor name="Costa Rica" direction="W"/> <neighbor name="Colombia" direction="E"/> </country> </data> xml數據
xml協議在各個語言裏的都 是支持的,在python中能夠用如下模塊操做xml:
1 # print(root.iter('year')) #全文搜索 2 # print(root.find('country')) #在root的子節點找,只找一個 3 # print(root.findall('country')) #在root的子節點找,找全部
1 import xml.etree.ElementTree as ET 2 3 tree = ET.parse("xmltest.xml") 4 root = tree.getroot() 5 print(root.tag) 6 7 #遍歷xml文檔 8 for child in root: 9 print('========>',child.tag,child.attrib,child.attrib['name']) 10 for i in child: 11 print(i.tag,i.attrib,i.text) 12 13 #只遍歷year 節點 14 for node in root.iter('year'): 15 print(node.tag,node.text) 16 #--------------------------------------- 17 18 import xml.etree.ElementTree as ET 19 20 tree = ET.parse("xmltest.xml") 21 root = tree.getroot() 22 23 #修改 24 for node in root.iter('year'): 25 new_year=int(node.text)+1 26 node.text=str(new_year) 27 node.set('updated','yes') 28 node.set('version','1.0') 29 tree.write('test.xml') 30 31 32 #刪除node 33 for country in root.findall('country'): 34 rank = int(country.find('rank').text) 35 if rank > 50: 36 root.remove(country) 37 38 tree.write('output.xml')
1 #在country內添加(append)節點year2 2 import xml.etree.ElementTree as ET 3 tree = ET.parse("a.xml") 4 root=tree.getroot() 5 for country in root.findall('country'): 6 for year in country.findall('year'): 7 if int(year.text) > 2000: 8 year2=ET.Element('year2') 9 year2.text='新年' 10 year2.attrib={'update':'yes'} 11 country.append(year2) #往country節點下添加子節點 12 13 tree.write('a.xml.swap')
本身建立xml文檔:
1 import xml.etree.ElementTree as ET 2 3 4 new_xml = ET.Element("namelist") 5 name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"}) 6 age = ET.SubElement(name,"age",attrib={"checked":"no"}) 7 sex = ET.SubElement(name,"sex") 8 sex.text = '33' 9 name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"no"}) 10 age = ET.SubElement(name2,"age") 11 age.text = '19' 12 13 et = ET.ElementTree(new_xml) #生成文檔對象 14 et.write("test.xml", encoding="utf-8",xml_declaration=True) 15 16 ET.dump(new_xml) #打印生成的格式
9、configparser模塊
配置文件:
# 註釋1 ; 註釋2 [section1] k1 = v1 k2:v2 user=egon age=18 is_admin=true salary=31 [section2] k1 = v1
一、讀取:
1 import configparser 2 3 config=configparser.ConfigParser() 4 config.read('a.cfg') 5 6 #查看全部的標題 7 res=config.sections() #['section1', 'section2'] 8 print(res) 9 10 #查看標題section1下全部key=value的key 11 options=config.options('section1') 12 print(options) #['k1', 'k2', 'user', 'age', 'is_admin', 'salary'] 13 14 #查看標題section1下全部key=value的(key,value)格式 15 item_list=config.items('section1') 16 print(item_list) #[('k1', 'v1'), ('k2', 'v2'), ('user', 'egon'), ('age', '18'), ('is_admin', 'true'), ('salary', '31')] 17 18 #查看標題section1下user的值=>字符串格式 19 val=config.get('section1','user') 20 print(val) #egon 21 22 #查看標題section1下age的值=>整數格式 23 val1=config.getint('section1','age') 24 print(val1) #18 25 26 #查看標題section1下is_admin的值=>布爾值格式 27 val2=config.getboolean('section1','is_admin') 28 print(val2) #True 29 30 #查看標題section1下salary的值=>浮點型格式 31 val3=config.getfloat('section1','salary') 32 print(val3) #31.0
二、改寫
1 import configparser 2 3 config=configparser.ConfigParser() 4 config.read('a.cfg') 5 6 7 #刪除整個標題section2 8 config.remove_section('section2') 9 10 #刪除標題section1下的某個k1和k2 11 config.remove_option('section1','k1') 12 config.remove_option('section1','k2') 13 14 #判斷是否存在某個標題 15 print(config.has_section('section1')) 16 17 #判斷標題section1下是否有user 18 print(config.has_option('section1','')) 19 20 21 #添加一個標題 22 config.add_section('egon') 23 24 #在標題egon下添加name=egon,age=18的配置 25 config.set('egon','name','egon') 26 config.set('egon','age',18) #報錯,必須是字符串 27 28 29 #最後將修改的內容寫入文件,完成最終的修改 30 config.write(open('a.cfg','w'))
==============================
應用示例:
1 [DEFAULT] 2 ServerAliveInterval = 45 3 Compression = yes 4 CompressionLevel = 9 5 ForwardX11 = yes 6 7 [bitbucket.org] 8 User = hg 9 10 [topsecret.server.com] 11 Port = 50022 12 ForwardX11 = no
一、獲取全部節點
1 import configparser 2 config=configparser.ConfigParser() 3 config.read('test.ini',encoding='utf-8') 4 res=config.sections() 5 print(res) 6 7 ''' 8 打印結果: 9 ['bitbucket.org', 'topsecret.server.com'] 10 '''
二、獲取指定節點下全部的鍵值對
1 import configparser 2 config=configparser.ConfigParser() 3 config.read('test.ini',encoding='utf-8') 4 res=config.items('bitbucket.org') 5 print(res) 6 7 ''' 8 打印結果:(包含DEFAULT以及bitbucket.org這倆標題下全部的items) 9 [('serveraliveinterval', '45'), ('compression', 'yes'), ('compressionlevel', '9'), ('forwardx11', 'yes'), ('user', 'hg')] 10 '''
三、獲取指定節點下全部的鍵
1 import configparser 2 config=configparser.ConfigParser() 3 config.read('test.ini',encoding='utf-8') 4 res=config.options('bitbucket.org') 5 print(res) 6 7 ''' 8 打印結果:(包含DEFAULT以及bitbucket.org這倆標題下全部的鍵) 9 ['user', 'serveraliveinterval', 'compression', 'compressionlevel', 'forwardx11']'''
四、獲取指定節點下指定key的值
1 import configparser 2 config=configparser.ConfigParser() 3 config.read('test.ini',encoding='utf-8') 4 res1=config.get('bitbucket.org','user') 5 6 res2=config.getint('topsecret.server.com','port') 7 res3=config.getfloat('topsecret.server.com','port') 8 res4=config.getboolean('topsecret.server.com','ForwardX11') 9 10 print(res1) 11 print(res2) 12 print(res3) 13 print(res4) 14 15 ''' 16 打印結果: 17 hg 18 50022.0 19 False 20 '''
五、檢查、刪除、添加節點
1 import configparser 2 config=configparser.ConfigParser() 3 config.read('test.ini',encoding='utf-8') 4 5 #檢查 6 has_sec=config.has_section('bitbucket.org') 7 print(has_sec) #打印True 8 9 #添加節點 10 config.add_section('egon') #已經存在則報錯 11 config['egon']['username']='gangdan' 12 config['egon']['age']='18' 13 config.write(open('test.ini','w')) 14 15 #刪除節點 16 config.remove_section('egon') 17 config.write(open('test.ini','w'))
六、檢查、刪除、設置指定組內的鍵值對
1 import configparser 2 config=configparser.ConfigParser() 3 config.read('test.ini',encoding='utf-8') 4 5 #檢查 6 has_sec=config.has_option('bitbucket.org','user') #bitbucket.org下有一個鍵user 7 print(has_sec) #打印True 8 9 #刪除 10 config.remove_option('DEFAULT','forwardx11') 11 config.write(open('test.ini','w')) 12 13 #設置 14 config.set('bitbucket.org','user','gangdang') 15 config.write(open('test.ini','w'))
添加一個ini應用文檔
1 import configparser 2 3 config = configparser.ConfigParser() 4 config["DEFAULT"] = {'ServerAliveInterval': '45', 5 'Compression': 'yes', 6 'CompressionLevel': '9'} 7 8 config['bitbucket.org'] = {} 9 config['bitbucket.org']['User'] = 'hg' 10 config['topsecret.server.com'] = {} 11 topsecret = config['topsecret.server.com'] 12 topsecret['Host Port'] = '50022' # mutates the parser 13 topsecret['ForwardX11'] = 'no' # same here 14 config['DEFAULT']['ForwardX11'] = 'yes' 15 with open('example.ini', 'w') as configfile: 16 config.write(configfile) 17 18 基於上述方法添加一個ini文檔
10、hashlib模塊
hash:一種算法 ,3.x裏代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法。
三個特色:
1.內容相同則hash運算結果相同,內容稍微改變則hash值則變
2.不可逆推
3.相同算法:不管校驗多長的數據,獲得的哈希值長度固定。
1 import hashlib 2 3 m=hashlib.md5()# m=hashlib.sha256() 4 5 m.update('hello'.encode('utf8')) 6 print(m.hexdigest()) #5d41402abc4b2a76b9719d911017c592 7 8 m.update('alvin'.encode('utf8')) 9 10 print(m.hexdigest()) #92a7e713c30abbb0319fa07da2a5c4af 11 12 m2=hashlib.md5() 13 m2.update('helloalvin'.encode('utf8')) 14 print(m2.hexdigest()) #92a7e713c30abbb0319fa07da2a5c4af 15 16 ''' 17 注意:把一段很長的數據update屢次,與一次update這段長數據,獲得的結果同樣 18 可是update屢次爲校驗大文件提供了可能。 19 '''
以上加密算法雖然依然很是厲害,但時候存在缺陷,即:經過撞庫能夠反解。因此,有必要對加密算法中添加自定義key再來作加密。
1 import hashlib 2 3 # ######## 256 ######## 4 5 hash = hashlib.sha256('898oaFs09f'.encode('utf8')) 6 hash.update('alvin'.encode('utf8')) 7 print (hash.hexdigest())#e79e68f070cdedcfe63eaf1a2e92c83b4cfb1b5c6bc452d214c1b7e77cdfd1c7
1 import hashlib 2 passwds=[ 3 'alex3714', 4 'alex1313', 5 'alex94139413', 6 'alex123456', 7 '123456alex', 8 'a123lex', 9 ] 10 def make_passwd_dic(passwds): 11 dic={} 12 for passwd in passwds: 13 m=hashlib.md5() 14 m.update(passwd.encode('utf-8')) 15 dic[passwd]=m.hexdigest() 16 return dic 17 18 def break_code(cryptograph,passwd_dic): 19 for k,v in passwd_dic.items(): 20 if v == cryptograph: 21 print('密碼是===>\033[46m%s\033[0m' %k) 22 23 cryptograph='aee949757a2e698417463d47acac93df' 24 break_code(cryptograph,make_passwd_dic(passwds))
python 還有一個 hmac 模塊,它內部對咱們建立 key 和 內容 進行進一步的處理而後再加密:
1 import hmac 2 h = hmac.new('alvin'.encode('utf8')) 3 h.update('hello'.encode('utf8')) 4 print (h.hexdigest())#320df9832eab4c038b6c1d7ed73a5940
11、suprocess模塊
1 import subprocess 2 3 ''' 4 sh-3.2# ls /Users/egon/Desktop |grep txt$ 5 mysql.txt 6 tt.txt 7 事物.txt 8 ''' 9 10 res1=subprocess.Popen('ls /Users/jieli/Desktop',shell=True,stdout=subprocess.PIPE) 11 res=subprocess.Popen('grep txt$',shell=True,stdin=res1.stdout, 12 stdout=subprocess.PIPE) 13 14 print(res.stdout.read().decode('utf-8')) 15 16 17 #等同於上面,可是上面的優點在於,一個數據流能夠和另一個數據流交互,能夠經過爬蟲獲得結果真後交給grep 18 res1=subprocess.Popen('ls /Users/jieli/Desktop |grep txt$',shell=True,stdout=subprocess.PIPE) 19 print(res1.stdout.read().decode('utf-8')) 20 21 22 #windows下: 23 # dir | findstr 'test*' 24 # dir | findstr 'txt$' 25 import subprocess 26 res1=subprocess.Popen(r'dir C:\Users\Administrator\PycharmProjects\test\函數備課',shell=True,stdout=subprocess.PIPE) 27 res=subprocess.Popen('findstr test*',shell=True,stdin=res1.stdout, 28 stdout=subprocess.PIPE) 29 30 print(res.stdout.read().decode('gbk')) #subprocess使用當前系統默認編碼,獲得結果爲bytes類型,在windows下須要用gbk解碼
1 import subprocess 2 3 res=subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE) 4 print(res) 5 print(res.stdout.read().decode('gbk')) 6 7 8 import subprocess 9 10 res=subprocess.Popen('diasdfasdfr',shell=True, 11 stderr=subprocess.PIPE, 12 stdout=subprocess.PIPE) 13 14 print('=====>',res.stdout.read()) 15 print('=====>',res.stderr.read().decode('gbk')) 16 17 18 #ls |grep txt$ 19 res1=subprocess.Popen(r'dir E:\wupeiqi\s17\day06',shell=True,stdout=subprocess.PIPE) 20 # print(res1.stdout.read()) 21 22 res=subprocess.Popen(r'findstr txt*',shell=True, 23 stdin=res1.stdout, 24 stderr=subprocess.PIPE, 25 stdout=subprocess.PIPE) 26 27 print('===>',res.stdout.read().decode('gbk'))#管道取一次就空了 28 print('===>',res.stdout.read().decode('gbk')) 29 print('===>',res.stdout.read().decode('gbk')) 30 print('===>',res.stdout.read().decode('gbk')) 31 print('===>',res.stdout.read().decode('gbk')) 32 print('===>',res.stdout.read().decode('gbk')) 33 print('===>',res.stdout.read().decode('gbk'))
12、logging模塊
logging模塊是用於便捷記錄日誌且線程安全的模塊。
1 import logging 2 ''' 3 一:若是不指定filename,則默認打印到終端 4 二:指定日誌級別: 5 指定方式: 6 1:level=10 7 2:level=logging.ERROR 8 9 日誌級別種類: 10 CRITICAL = 50 11 FATAL = CRITICAL 12 ERROR = 40 13 WARNING = 30 14 WARN = WARNING 15 INFO = 20 16 DEBUG = 10 17 NOTSET = 0 18 19 三:指定日誌級別爲ERROR,則只有ERROR及其以上級別的日誌會被打印 20 ''' 21 22 23 logging.basicConfig(filename='access.log', 24 format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', 25 datefmt='%Y-%m-%d %H:%M:%S %p', 26 level=10) 27 28 logging.debug('debug') 29 logging.info('info') 30 logging.warning('warning') 31 logging.error('error') 32 logging.critical('critical') 33 logging.log(10,'log') #若是level=40,則只有logging.critical和loggin.error的日誌會被打印
可在logging.basicConfig()函數中經過具體參數來更改logging模塊默認行爲,可用參數有
filename:用指定的文件名建立FiledHandler(後邊會具體講解handler的概念),這樣日誌會被存儲在指定的文件中。
filemode:文件打開方式,在指定了filename時使用這個參數,默認值爲「a」還可指定爲「w」。
format:指定handler使用的日誌顯示格式。
datefmt:指定日期時間格式。
level:設置rootlogger(後邊會講解具體概念)的日誌級別
stream:用指定的stream建立StreamHandler。能夠指定輸出到sys.stderr,sys.stdout或者文件,默認爲sys.stderr。若同時列出了filename和stream兩個參數,則stream參數會被忽略。
日誌格式
%(name)s |
Logger的名字,並不是用戶名,詳細查看 |
%(levelno)s |
數字形式的日誌級別 |
%(levelname)s |
文本形式的日誌級別 |
%(pathname)s |
調用日誌輸出函數的模塊的完整路徑名,可能沒有 |
%(filename)s |
調用日誌輸出函數的模塊的文件名 |
%(module)s |
調用日誌輸出函數的模塊名 |
%(funcName)s |
調用日誌輸出函數的函數名 |
%(lineno)d |
調用日誌輸出函數的語句所在的代碼行 |
%(created)f |
當前時間,用UNIX標準的表示時間的浮 點數表示 |
%(relativeCreated)d |
輸出日誌信息時的,自Logger建立以 來的毫秒數 |
%(asctime)s |
字符串形式的當前時間。默認格式是 「2003-07-08 16:49:45,896」。逗號後面的是毫秒 |
%(thread)d |
線程ID。可能沒有 |
%(threadName)s |
線程名。可能沒有 |
%(process)d |
進程ID。可能沒有 |
%(message)s |
用戶輸出的消息 |