time時間模塊php
在Python中,一般有這幾種方式來表示時間:html
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 8 9 ########################################## 10 11 #時間戳 12 print(time.time()) 13 14 #結構化的時間 15 print(time.localtime()) 16 #本地時間,結構化格式,time.struct_time(tm_year=2017, tm_mon=6, tm_mday=6, tm_hour=15, tm_min=21, tm_sec=39, tm_wday=1, tm_yday=157, tm_isdst=0) 17 print(time.localtime().tm_year) 18 #本地時間,能夠指定顯示內容,tm_year表示年,輸出 2017 19 print(time.gmtime()) 20 #time.struct_time(tm_year=2017, tm_mon=6, tm_mday=6, tm_hour=7, tm_min=21, tm_sec=39, tm_wday=1, tm_yday=157, tm_isdst=0) 21 #UTC時區時間,和localtime()方法相似,UTC時區時間比正常時間慢8小時 22 23 #格式化的字符串 24 print(time.strftime('%Y-%m-%d %H:%M:%S')) #2017-06-06 15:23:33 25 print(time.strftime('%Y-%m-%d %X')) #2017-06-06 15:23:33 ,%X 等同於 %H:%M:%S
其中計算機認識的時間只能是'時間戳'格式,而程序員可處理的或者說人類能看懂的時間有: '格式化的時間字符串','結構化的時間' ,因而有了下圖的轉換關係node
1 #格式轉換 2 print(time.localtime(13211123)) #將指定時間戳轉換成結構化時間 3 4 print(time.localtime(time.time())) #將當前時間戳轉換成結構化時間 5 6 print(time.gmtime(time.time())) #將當前時間戳轉換成UTC時區結構化時間 7 8 print(time.mktime(time.localtime())) #當前結構化時間轉換成時間戳 9 10 print(time.strftime('%Y %X',time.localtime())) #當前結構化時間年和時間轉換成格式化字符串 11 12 print(time.strptime('2017-06-04 11:59:59','%Y-%m-%d %X')) #把指定格式化字符串時間轉換成結構化時間
1 #--------------------------按圖2轉換時間 2 print(time.ctime(123123132)) #把指定時間戳轉換成linux系統顯示的時間格式,Mon Nov 26 08:52:12 1973 3 4 print(time.asctime(time.localtime())) #把當前時間戳轉換成linux系統顯示的時間格式,Tue Jun 6 15:31:08 2017 5 6 #--------------------------其餘用法 7 sleep(secs) 8 # 線程推遲指定的時間運行,單位爲秒。
random隨機模塊python
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 item = [1, 3, 5, 7, 9] 16 random.shuffle(item) # 打亂item的順序,至關於"洗牌" 17 print(item)
1 #------隨機獲取列表中的ip地址 2 import random 3 proxy_ip=[ 4 '1.1.1.1', 5 '1.1.1.2', 6 '1.1.1.3', 7 '1.1.1.4', 8 ] 9 10 print(random.choice(proxy_ip)) 11 12 #------生成隨機驗證碼 13 import random 14 def v_code(n=5): 15 res='' 16 for i in range(n): 17 num=random.randint(0,9) 18 s=chr(random.randint(65,90)) 19 add=random.choice([num,s]) 20 res+=str(add) 21 return res 22 23 print(v_code(6))
os模塊是與操做系統交互的一個接口mysql
1 #---------os模塊用法 2 import os 3 os.getcwd() #獲取當前工做目錄,即當前python腳本工做的目錄路徑 4 os.chdir("dirname") #改變當前腳本工做目錄;至關於shell下cd 5 os.curdir #返回當前目錄: ('.') 6 os.pardir #獲取當前目錄的父目錄字符串名:('..') 7 os.makedirs('dirname1/dirname2') #可生成多層遞歸目錄 8 os.removedirs('dirname1') #若目錄爲空,則刪除,並遞歸到上一級目錄,如若也爲空,則刪除,依此類推 9 os.mkdir('dirname') #生成單級目錄;至關於shell中mkdir dirname 10 os.rmdir('dirname') #刪除單級空目錄,若目錄不爲空則沒法刪除,報錯;至關於shell中rmdir dirname 11 os.listdir('dirname') #列出指定目錄下的全部文件和子目錄,包括隱藏文件,並以列表方式打印 12 os.remove() #刪除一個文件 13 os.rename("oldname","newname") #重命名文件/目錄 14 os.stat('path/filename') #獲取文件/目錄信息 15 os.sep #輸出操做系統特定的路徑分隔符,win下爲"\\",Linux下爲"/" 16 os.linesep #輸出當前平臺使用的行終止符,win下爲"\t\n",Linux下爲"\n" 17 os.pathsep #輸出用於分割文件路徑的字符串 win下爲;,Linux下爲: 18 os.name #輸出字符串指示當前使用平臺。win->'nt'; Linux->'posix' 19 os.system("bash command") #運行shell命令,直接顯示 20 os.environ #獲取系統環境變量 21 os.path.abspath(path) #返回path規範化的絕對路徑 22 os.path.split(path) #將path分割成目錄和文件名二元組返回 23 os.path.dirname(path) #返回path的目錄。其實就是os.path.split(path)的第一個元素 24 os.path.basename(path) #返回path最後的文件名。如何path以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素 25 os.path.exists(path) #若是path存在,返回True;若是path不存在,返回False 26 os.path.isabs(path) #若是path是絕對路徑,返回True 27 os.path.isfile(path) #若是path是一個存在的文件,返回True。不然返回False 28 os.path.isdir(path) #若是path是一個存在的目錄,則返回True。不然返回False 29 os.path.join(path1[, path2[, ...]]) #將多個路徑組合後返回,第一個絕對路徑以前的參數將被忽略 30 os.path.getatime(path) #返回path所指向的文件或者目錄的最後存取時間 31 os.path.getmtime(path) #返回path所指向的文件或者目錄的最後修改時間 32 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
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__))))
1 #---------sys模塊用法 2 sys.argv #命令行參數List,第一個元素是程序自己路徑 3 sys.exit(n) #退出程序,正常退出時exit(0) 4 sys.version #獲取Python解釋程序的版本信息 5 sys.maxint #最大的Int值 6 sys.path #返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值 7 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 '''
一、shutil模塊,高級的 文件、文件夾、壓縮包 處理模塊linux
1 #---------shutil模塊用法 2 3 # shutil.copyfileobj(fsrc, fdst[, length]) 將文件內容拷貝到另外一個文件中 4 import shutil 5 shutil.copyfileobj(open('old.xml', 'r'), open('new.xml', 'w')) 6 7 # shutil.copyfile(src, dst) 拷貝文件 8 import shutil 9 shutil.copyfile('f1.log', 'f2.log') # 目標文件無需存在 10 11 # shutil.copymode(src, dst)僅拷貝權限。內容、組、用戶均不變 12 import shutil 13 shutil.copymode('f1.log', 'f2.log') # 目標文件必須存在 14 15 # shutil.copystat(src, dst) 僅拷貝狀態的信息,包括:mode bits, atime, mtime, flags 16 import shutil 17 shutil.copystat('f1.log', 'f2.log') # 目標文件必須存在 18 19 # shutil.copy(src, dst) 拷貝文件和權限 20 import shutil 21 shutil.copy('f1.log', 'f2.log') 22 23 # shutil.copy2(src, dst) 拷貝文件和狀態信息 24 import shutil 25 shutil.copy2('f1.log', 'f2.log') 26 27 # shutil.ignore_patterns(*patterns) shutil.copytree(src, dst, symlinks=False, ignore=None) 遞歸的去拷貝文件夾 28 import shutil 29 shutil.copytree('folder1', 'folder2',ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) # 目標目錄不能存在,注意對folder2目錄父級目錄要有可寫權限,ignore的意思是排除 30 31 32 # 拷貝軟連接,一般的拷貝都把軟鏈接拷貝成硬連接,即對待軟鏈接來講,建立新的文件 33 import shutil 34 shutil.copytree('f1', 'f2', symlinks=True, ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) 35 36 # shutil.rmtree(path[, ignore_errors[, onerror]]) 遞歸的去刪除文件 37 import shutil 38 shutil.rmtree('folder1') 39 40 # shutil.move(src, dst) 遞歸的去移動文件,它相似mv命令,其實就是重命名。 41 import shutil 42 shutil.move('folder1', 'folder3')
二、shutil模塊歸檔程序員
shutil.make_archive(base_name, format,...)web
建立壓縮包並返回文件路徑,例如:zip、tar算法
建立壓縮包並返回文件路徑,例如:zip、tarsql
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壓縮解壓縮
eval內置方法能夠將一個字符串轉成python對象,不過,eval方法是有侷限性的,對於普通的數據類型,json.loads和eval都能用,但遇到特殊類型的時候,eval就無論用了,因此eval的重點仍是一般用來執行一個字符串表達式,並返回表達式的值。
1 imporjson 2 x="[null,true,false,1]" 3 print(eval(x)#報錯,沒法解析null類型,而json就能夠 4 print(json.loads(x)
1.什麼是序列化
咱們把對象(變量)從內存中變成可存儲或傳輸的過程稱之爲序列化,在Python中叫pickling,在其餘語言中也被稱之爲serialization,marshalling,flattening等等,都是一個意思。
2.爲何要序列化?
1)持久保存狀態
需知一個軟件/程序的執行就在處理一系列狀態的變化,在編程語言中,'狀態'會以各類各樣有結構的數據類型(也可簡單的理解爲變量)的形式被保存在內存中。
內存是沒法永久保存數據的,當程序運行了一段時間,咱們斷電或者重啓程序,內存中關於這個程序的以前一段時間的數據(有結構)都被清空了。
在斷電或重啓程序以前將程序當前內存中全部的數據都保存下來(保存到文件中),以便於下次程序執行可以從文件中載入以前的數據,而後繼續執行,這就是序列化。
具體的來講,你玩使命召喚闖到了第13關,你保存遊戲狀態,關機走人,下次再玩,還能從上次的位置開始繼續闖關。或如,虛擬機狀態的掛起等
2)跨平臺數據交互
序列化以後,不只能夠把序列化後的內容寫入磁盤,還能夠經過網絡傳輸到別的機器上,若是收發的雙方約定好實用一種序列化的格式,那麼便打破了平臺/語言差別化帶來的限制,實現了跨平臺數據交互。
反過來,把變量內容從序列化的對象從新讀到內存裏稱之爲反序列化,即unpickling。
3.如何序列化之json和pickle:
json:
若是咱們要在不一樣的編程語言之間傳遞對象,就必須把對象序列化爲標準格式,好比XML,但更好的方法是序列化爲JSON,由於JSON表示出來就是一個字符串,能夠被全部語言讀取,也能夠方便地存儲到磁盤或者經過網絡傳輸。JSON不只是標準格式,而且比XML更快,並且能夠直接在Web頁面中讀取,很是方便。
JSON表示的對象就是標準的JavaScript語言的對象,JSON和Python內置的數據類型對應以下:
1 import json 2 3 dic={'name':'alvin','age':23,'sex':'male'} 4 print(type(dic))#<class 'dict'> 5 6 j=json.dumps(dic) 7 print(type(j))#<class 'str'> 8 9 10 f=open('序列化對象','w') 11 f.write(j) #-------------------等價於json.dump(dic,f) 12 f.close() 13 #-----------------------------反序列化<br> 14 import json 15 f=open('序列化對象') 16 data=json.loads(f.read())# 等價於data=json.load(f)
1 #--------注意點 2 3 import json 4 #dct="{'1':111}"#json 不認單引號 5 #dct=str({"1":111})#報錯,由於生成的數據仍是單引號:{'one': 1} 6 7 dct='{"1":"111"}' 8 print(json.loads(dct)) 9 10 #conclusion: 11 # 不管數據是怎樣建立的,只要知足json格式,就能夠json.loads出來,不必定非要dumps的數據才能loads
pickle:
Pickle的問題和全部其餘編程語言特有的序列化問題同樣,就是它只能用於Python,而且可能不一樣版本的Python彼此都不兼容,所以,只能用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'])
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()
xml是實現不一樣語言或程序之間進行數據交換的協議,跟json差很少,但json使用起來更簡單,不過,古時候,在json還沒誕生的黑暗年代,你們只能選擇用xml呀,至今不少傳統公司如金融行業的不少系統的接口還主要是xml。
xml的格式以下,就是經過<>節點來區別數據結構的:
1 <?xml version="1.0"?> 2 <data> 3 <country name="Liechtenstein"> 4 <rank updated="yes">2</rank> 5 <year>2008</year> 6 <gdppc>141100</gdppc> 7 <neighbor name="Austria" direction="E"/> 8 <neighbor name="Switzerland" direction="W"/> 9 </country> 10 <country name="Singapore"> 11 <rank updated="yes">5</rank> 12 <year>2011</year> 13 <gdppc>59900</gdppc> 14 <neighbor name="Malaysia" direction="N"/> 15 </country> 16 <country name="Panama"> 17 <rank updated="yes">69</rank> 18 <year>2011</year> 19 <gdppc>13600</gdppc> 20 <neighbor name="Costa Rica" direction="W"/> 21 <neighbor name="Colombia" direction="E"/> 22 </country> 23 </data> 24 25 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) #打印生成的格式
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再來作加密。
import hashlib # ######## 256 ######## hash = hashlib.sha256('898oaFs09f'.encode('utf8')) hash.update('alvin'.encode('utf8')) 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 和 內容 進行進一步的處理而後再加密:
imporhmac hmac.new('alvin'.encode('utf8')) h.update('hello'.encode('utf8')) prin(h.hexdigest())#320df9832eab4c038b6c1d7ed73a5940
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 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 |
|
%(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 |
用戶輸出的消息 |
配置文件以下:
1 # 註釋1 2 ; 註釋2 3 4 [section1] 5 k1 = v1 6 k2:v2 7 user=egon 8 age=18 9 is_admin=true 10 salary=31 11 12 [section2] 13 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'))
==============》更詳細以下
好多軟件的常見文檔格式以下,文件名爲test.ini:
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 [PHP] 2 engine = On 3 short_open_tag = Off 4 asp_tags = Off 5 precision = 14 6 output_buffering = 4096 7 zlib.output_compression = Off 8 implicit_flush = Off 9 unserialize_callback_func = 10 serialize_precision = 17 11 disable_functions = 12 disable_classes = 13 zend.enable_gc = On 14 expose_php = On 15 max_execution_time = 30 16 max_input_time = 60 17 memory_limit = 128M 18 error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT 19 display_errors = Off 20 display_startup_errors = Off 21 log_errors = On 22 log_errors_max_len = 1024 23 ignore_repeated_errors = Off 24 ignore_repeated_source = Off 25 report_memleaks = On 26 track_errors = Off 27 html_errors = On 28 variables_order = "GPCS" 29 request_order = "GP" 30 register_argc_argv = Off 31 auto_globals_jit = On 32 post_max_size = 8M 33 auto_prepend_file = 34 auto_append_file = 35 default_mimetype = "text/html" 36 doc_root = 37 user_dir = 38 enable_dl = Off 39 file_uploads = On 40 upload_max_filesize = 2M 41 max_file_uploads = 20 42 allow_url_fopen = On 43 allow_url_include = Off 44 default_socket_timeout = 60 45 [CLI Server] 46 cli_server.color = On 47 [Date] 48 [filter] 49 [iconv] 50 [intl] 51 [sqlite] 52 [sqlite3] 53 [Pcre] 54 [Pdo] 55 [Pdo_mysql] 56 pdo_mysql.cache_size = 2000 57 pdo_mysql.default_socket= 58 [Phar] 59 [mail function] 60 SMTP = localhost 61 smtp_port = 25 62 sendmail_path = /usr/sbin/sendmail -t -i 63 mail.add_x_header = On 64 [SQL] 65 sql.safe_mode = Off 66 [ODBC] 67 odbc.allow_persistent = On 68 odbc.check_persistent = On 69 odbc.max_persistent = -1 70 odbc.max_links = -1 71 odbc.defaultlrl = 4096 72 odbc.defaultbinmode = 1 73 [Interbase] 74 ibase.allow_persistent = 1 75 ibase.max_persistent = -1 76 ibase.max_links = -1 77 ibase.timestampformat = "%Y-%m-%d %H:%M:%S" 78 ibase.dateformat = "%Y-%m-%d" 79 ibase.timeformat = "%H:%M:%S" 80 [MySQL] 81 mysql.allow_local_infile = On 82 mysql.allow_persistent = On 83 mysql.cache_size = 2000 84 mysql.max_persistent = -1 85 mysql.max_links = -1 86 mysql.default_port = 87 mysql.default_socket = 88 mysql.default_host = 89 mysql.default_user = 90 mysql.default_password = 91 mysql.connect_timeout = 60 92 mysql.trace_mode = Off 93 [MySQLi] 94 mysqli.max_persistent = -1 95 mysqli.allow_persistent = On 96 mysqli.max_links = -1 97 mysqli.cache_size = 2000 98 mysqli.default_port = 3306 99 mysqli.default_socket = 100 mysqli.default_host = 101 mysqli.default_user = 102 mysqli.default_pw = 103 mysqli.reconnect = Off 104 [mysqlnd] 105 mysqlnd.collect_statistics = On 106 mysqlnd.collect_memory_statistics = Off 107 [OCI8] 108 [PostgreSQL] 109 pgsql.allow_persistent = On 110 pgsql.auto_reset_persistent = Off 111 pgsql.max_persistent = -1 112 pgsql.max_links = -1 113 pgsql.ignore_notice = 0 114 pgsql.log_notice = 0 115 [Sybase-CT] 116 sybct.allow_persistent = On 117 sybct.max_persistent = -1 118 sybct.max_links = -1 119 sybct.min_server_severity = 10 120 sybct.min_client_severity = 10 121 [bcmath] 122 bcmath.scale = 0 123 [browscap] 124 [Session] 125 session.save_handler = files 126 session.use_cookies = 1 127 session.use_only_cookies = 1 128 session.name = PHPSESSID 129 session.auto_start = 0 130 session.cookie_lifetime = 0 131 session.cookie_path = / 132 session.cookie_domain = 133 session.cookie_httponly = 134 session.serialize_handler = php 135 session.gc_probability = 1 136 session.gc_divisor = 1000 137 session.gc_maxlifetime = 1440 138 session.bug_compat_42 = Off 139 session.bug_compat_warn = Off 140 session.referer_check = 141 session.cache_limiter = nocache 142 session.cache_expire = 180 143 session.use_trans_sid = 0 144 session.hash_function = 0 145 session.hash_bits_per_character = 5 146 url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry" 147 [MSSQL] 148 mssql.allow_persistent = On 149 mssql.max_persistent = -1 150 mssql.max_links = -1 151 mssql.min_error_severity = 10 152 mssql.min_message_severity = 10 153 mssql.compatability_mode = Off 154 mssql.secure_connection = Off 155 [Assertion] 156 [mbstring] 157 [gd] 158 [exif] 159 [Tidy] 160 tidy.clean_output = Off 161 [soap] 162 soap.wsdl_cache_enabled=1 163 soap.wsdl_cache_dir="/tmp" 164 soap.wsdl_cache_ttl=86400 165 soap.wsdl_cache_limit = 5 166 [sysvshm] 167 [ldap] 168 ldap.max_links = -1 169 [mcrypt] 170 [dba] 171 172 php.ini文件的格式也是如翠
1 獲取全部節點
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 '''
2 獲取指定節點下全部的鍵值對
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 '''
3 獲取指定節點下全部的建
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']'''
4 獲取指定節點下指定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 '''
5 檢查、刪除、添加節點
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'))
6 檢查、刪除、設置指定組內的鍵值對
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'))
1 """ 2 基於上述方法添加一個ini文檔 3 """ 4 import configparser 5 6 config = configparser.ConfigParser() 7 config["DEFAULT"] = {'ServerAliveInterval': '45', 8 'Compression': 'yes', 9 'CompressionLevel': '9'} 10 11 config['bitbucket.org'] = {} 12 config['bitbucket.org']['User'] = 'hg' 13 config['topsecret.server.com'] = {} 14 topsecret = config['topsecret.server.com'] 15 topsecret['Host Port'] = '50022' # mutates the parser 16 topsecret['ForwardX11'] = 'no' # same here 17 config['DEFAULT']['ForwardX11'] = 'yes' 18 with open('example.ini', 'w') as configfile: 19 config.write(configfile)
目錄結構: