week5node
1 定義python
模塊: 用來從邏輯上組織python代碼,本質是.py結尾的python文件。正則表達式
包:用來從邏輯上組織模塊的,本質是一個目錄(必須存在一個_init_.py文件)。算法
2 導入方法shell
import module_namejson
import module1_name,module2_namebash
from module_name import * #導入module中全部內容,不建議使用,不能經過module_name.方式調用模塊中的函數,而是直接經過函數名調用網絡
from module_name import def1_name,def2_nameapp
from module_name import def_name as 別名dom
3 import本質
import module_name ----> module_name = all code #將module代碼解釋後賦值給module_name
from module_name import def_name ---> 將 def_name 直接複製到當前文件中執行
導入模塊的本質就是把python文件解釋一遍。
導入包的本質就是執行該包下的_init_.py文件。
4 導入優化
import module_name ---> module_name.py ---> module_name.py的路徑 ---> sys.path
import os import sys print(__file__) # 打印相對路徑 print(os.path.abspath(__file__)) # 打印絕對路徑 print(os.path.dirname(os.path.abspath(__file__))) # 父目錄路徑 print(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) # 父父目錄路徑 PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(PATH) # 加入環境變量 sys.path是個list,可使用sys.path.insert插入 from core import main main.atm()
在_init_文件導入模塊:from . import module_name #在當前目錄下導入module
在python文件中導入包:import passage_name,能夠在文件中passage_name.module_name.def_name調用module中的方法
5 模塊分類
5.1 時間模塊(time&datatime)
5.1.1 時間表示形式
UTC(Coordinated Universal Time,世界協調時)亦即格林威治天文時間,世界標準時間。在中國爲UTC+8。
表示時間方式:1)時間戳 2)格式化的時間字符串 3)元組(struct_time)共九個元素。
import time # <1> 時間戳 print(time.time()) # 時間戳:1521424491.5176704 # <2> 時間字符串 print(time.strftime("%Y-%m-%d %X")) #格式化的時間字符串:'2018-03-19 09:54:51' # <3> 時間元組 print(time.localtime()) #本地時區的struct_time:'time.struct_time(tm_year=2018, tm_mon=3, tm_mday=19, tm_hour=9, tm_min=54, tm_sec=51, tm_wday=0, tm_yday=78, tm_isdst=0)' print(time.gmtime()) #UTC時區的struct_time:isdst爲時區
5.1.2 時間的轉換
#時間戳<- - ->結構化時間: localtime/gmtime/mktime print(time.localtime(3600*24)) print(time.gmtime(3600*24)) print(time.mktime(time.localtime())) #字符串時間<- - ->結構化時間: strftime/strptime print(time.strftime("%Y-%m-%d %X", time.localtime())) print(time.strptime("2017-03-16","%Y-%m-%d"))
print(time.asctime(time.localtime())) print(time.ctime(1521425493.0))
5.1.3 其餘方法
#延遲時間
time.sleep(seconds)
#時間加減
import datetime
print(datetime.datetime.now()) #返回當前時間 2018-03-19 10:17:39.694514
print(datetime.date.fromtimestamp(time.time()) ) # 時間戳直接轉成日期格式 2018-03-19
print(datetime.datetime.now() + datetime.timedelta(3)) #當前時間+3天
print(datetime.datetime.now() + datetime.timedelta(-3)) #當前時間-3天
print(datetime.datetime.now() + datetime.timedelta(hours=3)) #當前時間+3小時
print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #當前時間+30分
c_time = datetime.datetime.now()
print(c_time.replace(minute=3,hour=2)) #時間替換
5.2 ramdon模塊
import random print(random.random()) # (0,1)float 大於0且小於1之間的小數 print(random.randint(1, 3)) # [1,3] 大於等於1且小於等於3之間的整數 print(random.randrange(1, 3)) # [1,3) 大於等於1且小於3之間的整數 print(random.choice([1, '23', [4, 5]])) # 1或者23或者[4,5] print(random.sample([1, '23', [4, 5]], 2)) # 列表元素任意2個組合 print(random.uniform(1, 3)) # 大於1小於3的小數,如1.927109612082716 item = [1, 3, 5, 7, 9] random.shuffle(item) # 打亂item的順序,至關於"洗牌" print(item)
生成隨機驗證碼
import random def make_code(n): res='' for i in range(n): s1=chr(random.randint(65,90)) s2=str(random.randint(0,9)) res+=random.choice([s1,s2]) return res print(make_code(4))
5.3 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.sep 輸出操做系統特定的路徑分隔符,win下爲"\\",Linux下爲"/" os.linesep 輸出當前平臺使用的行終止符,win下爲"\t\n",Linux下爲"\n" os.pathsep 輸出用於分割文件路徑的字符串 win下爲;,Linux下爲: os.name 輸出字符串指示當前使用平臺。win->'nt'; Linux->'posix' os.system("bash command") 運行shell命令,直接顯示 os.environ 獲取系統環境變量 os.path.abspath(path) 返回path規範化的絕對路徑 os.path.split(path) 將path分割成目錄和文件名二元組返回 os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素 os.path.basename(path) 返回path最後的文件名。如何path以/或\結尾,那麼就會返回空值。即os.path.split(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.getatime(path) 返回path所指向的文件或者目錄的最後訪問時間 os.path.getmtime(path) 返回path所指向的文件或者目錄的最後修改時間 os.path.getsize(path) 返回path的大小 '''
5.4 sys模塊
''' sys.argv 命令行參數List,第一個元素是程序自己路徑,可傳參 sys.exit(n) 退出程序,正常退出時exit(0) sys.version 獲取Python解釋程序的版本信息 sys.maxint 最大的Int值 sys.path 返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值 sys.platform 返回操做系統平臺名稱 '''
5.5 shutil模塊
import shutil f1= open('file1','r',encoding='utf-8') f2= open('file2','w',encoding='utf-8') shutil.copyfileobj(f1,f2) #將文件內容拷貝到另外一個文件中
import shutil shutil.copyfile('file2','file3') #拷貝文件,不須要打開文件,目標文件無需存在
import shutil shutil.copymode('file1','file2') #僅拷貝權限,內容、組、用戶均不變,目標文件必須存在
import shutil shutil.copystat('file1','file3') #僅拷貝狀態的信息,包括:mode bits, atime, mtime, flags,目標文件必須存在
import shutil shutil.copy('file1','file2')#拷貝文件和權限
import shutil shutil.copy2('file1','file2')#拷貝文件和狀態信息
import shutil shutil.copytree('a','copy_a') #遞歸的去拷貝文件夾
import shutil shutil.rmtree('copy_a') #遞歸的去刪除文件
import shutil shutil.move('file3','a')#遞歸的去移動文件,它相似mv命令
壓縮文件:
如 data_bak---->保存至當前路徑
如:/tmp/data_bak--->保存至/tmp/
import shutil shutil.make_archive('archive_test','zip',r'C:\Users\zhouxy\PycharmProjects\untitled\day4') #講某路徑下全部文件壓縮到當前路徑
import zipfile z = zipfile.ZipFile('file.zip','w') #在當前路徑下壓縮指定文件 z.write('file1') print('-----') z.write('file2') z.close()
解壓文件:
import zipfile z = zipfile.ZipFile('archive_test.zip', 'r') z.extractall() z.close()
5.6 json&pickle模塊
5.6.1 序列化緣由
1.持久保存狀態
2.跨平臺數據交互
5.6.2 序列化方式
5.7 shelve模塊
shelve模塊是一個簡單的k,v將內存數據經過文件持久化的模塊,能夠持久化任何pickle可支持的python數據格式。
import shelve d = shelve.open('shelve_test') #打開一個文件 name = ["zhouxy", "female", 18] d["test"] = name # 持久化列表 d['info']={'name':'zhouxy','age':18} #持久化dict print(d.get('test')) print(d.get('info')) d.close()
5.8 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>
import xml.etree.cElementTree as ET tree = ET.parse('xml_test.xml') root = tree.getroot() print(root.tag) #遍歷xml文檔 for child in root: print(child.tag,child.attrib) for i in child: print(i.tag,i.text,i.attrib) #遍歷year節點 for note in root.iter('year'): print(note.tag,note.text)
import xml.etree.cElementTree as ET tree = ET.parse('xml_test.xml') root = tree.getroot() #修改 for node in root.iter('year'): new_year = int(node.text)+1 node.text = str(new_year) node.set('updated','zhouxy') #增長屬性 tree.write('xml_test.xml') #刪除 for country in root.findall('country'): rank = int(country.find('rank').text) if rank > 50: root.remove(country) tree.write('xml_test.xml')
建立xml文檔
import xml.etree.ElementTree as ET name_xml = ET.Element("namelist") #建立根節點並賦值給一個對象 name = ET.SubElement(name_xml, "name", attrib={"enrolled": "yes"}) #建立一級子節點 name.text = 'zhouxy' age = ET.SubElement(name, "age", attrib={"checked": "no"}) #建立二級子節點 age.text = '18' sex = ET.SubElement(name, "sex") #建立二級子節點 sex.text = 'F' name2 = ET.SubElement(name_xml, "name", attrib={"enrolled": "no"}) age = ET.SubElement(name2, "age") et = ET.ElementTree(name_xml) # 生成文檔對象 et.write("name.xml", encoding="utf-8", xml_declaration=True) ET.dump(name_xml) # 打印生成的格式
5.9 ConfigParser模塊
用於生成和修改常見配置文檔。文檔格式以下:
[DEFAULT] ServerAliveInterval = 45 Compression = yes CompressionLevel = 9 ForwardX11 = yes [bitbucket.org] User = hg [topsecret.server.com] Port = 50022 ForwardX11 = no
import configparser # python2.X 爲 ConfigParser config = configparser.ConfigParser() # 建立一個config對象 config["DEFAULT"] = {'ServerAliveInterval': '45', 'Compression': 'yes', 'CompressionLevel': '9'} config['DEFAULT']['ForwardX11'] = 'yes' config['bitbucket.org'] = {} config['bitbucket.org']['User'] = 'hg' config['topsecret.server.com'] = {} topsecret = config['topsecret.server.com'] topsecret['Host Port'] = '50022' topsecret['ForwardX11'] = 'no' with open('example.conf', 'w') as configfile: config.write(configfile)
# 讀取 import configparser config=configparser.ConfigParser() config.read('db.conf') print(config.defaults()) # 查看default全部內容 print(config.sections()) #查看全部的標題 print(config.options('bitbucket.org')) #查看標題bitbucket.org和default下全部key=value的key,與default相同的key不重複顯示 print(config.items('bitbucket.org')) #查看標題bitbucket.org下和default全部key=value的(key,value)格式 print(config.get('bitbucket.org','User')) #查看標題bitbucket.org下User的值=>字符串格式 print(config.getint('DEFAULT','ServerAliveInterval'))#查看標題default下ServerAliveInterval的值=>整數格式 print(config.getboolean('DEFAULT','ForwardX11')) #查看標題default下ForwardX11的值=>布爾值格式 print(config.getfloat('topsecret.server.com','Port')) #查看標題topsecret.server.com下Port的值=>浮點型格式
import configparser config=configparser.ConfigParser() config.read('example.conf',encoding='utf-8') config.remove_section('bitbucket.org') #刪除整個標題bitbucket.org config.remove_option('topsecret.server.com','ForwardX11') #刪除標題topsecret.server.com下的某個ForwardX11 print(config.has_section('bitbucket.org')) #判斷是否存在某個標題 print(config.has_option('topsecret.server.com','ForwardX11')) #判斷標題topsecret.server.com和default下是否存在ForwardX11 config.add_section('zhouxy') #添加一個標題 config.set('zhouxy','name','zhouxy') #在標題zhouxy下添加name=zhouxy,age=18的配置 #config.set('egon','age',18) #報錯,必須是字符串 config.write(open('example.conf','w')) #最後將修改的內容寫入文件,完成最終的修改
5.10 hashlib模塊
hash:一種加密算法 ,3.x裏代替了md5模塊和sha模塊,主要提供 SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法。
三個特色:
import hashlib m = hashlib.md5() m.update('hello'.encode('utf-8')) #5d41402abc4b2a76b9719d911017c592 print(m.hexdigest()) m.update('it’s me'.encode('utf-8')) #不管update多少次,校驗的內容累加到一塊兒是同樣的內容 e36c615cdab6d98c413121f3b90de97a
print(m.hexdigest())
m2 = hashlib.md5()
m2.update('helloit’s me'.encode('utf-8'))
print(m2.hexdigest()) #16進制格式hash e36c615cdab6d98c413121f3b90de97a
print(m2.digest()) #2進制格式hash
python 還有一個 hmac 模塊。
散列消息鑑別碼,簡稱HMAC,是一種基於消息鑑別碼MAC(Message Authentication Code)的鑑別機制。使用HMAC時,消息通信的雙方,經過驗證消息中加入的鑑別密鑰K來鑑別消息的真僞。通常用於網絡通訊中消息加密,前提是雙方先要約定好key,就像接頭暗號同樣,而後消息發送把用key把消息加密,接收方用key+消息明文再加密,拿加密後的值 跟發送者的相對比是否相等,這樣就能驗證消息的真實性,及發送者的合法性了。
import hmac h = hmac.new('阿里巴巴'.encode('utf-8'),'芝麻開門'.encode('utf-8')) print(h.hexdigest()) h2 = hmac.new('阿里巴巴'.encode('utf-8')) h2.update('芝麻開門'.encode('utf-8')) print(h2.hexdigest())
5.11 re模塊
re模塊用於對python的正則表達式的操做。
元字符:. ^ $
import re #默認匹配除\n以外的任意一個字符 ret1=re.findall('李.','李一\na\n李二\nb\nc\n李三') #['李一', '李二', '李三'] #匹配字符開頭\A ret2=re.findall('^李.','李一\na\n李二\nb\nc\n李三') #['李一'] #匹配字符結尾\Z ret3=re.findall('李.$','李一\na\n李二\nb\nc\n李三') #['李三']
* + ? { }
import re #匹配*號前的字符0次或屢次 ret1=re.findall('李.*','李一\na\n李二\nb\nc\n李三') #['李一', '李二', '李三'] #匹配前一個字符1次或屢次 ret2=re.findall('李.+','李一\na\n李二\nb\nc\n李三') #['李一', '李二', '李三'] #匹配前一個字符n到m次 ret3=re.findall('(李.{1,2})\n','李一\na\n李二\nb\nc\n李三') #設定優先級的緣由 #['李一', '李二'] #匹配一個數字包括整型和浮點型 ret4=re.findall('\d+\.?\d*','12.45,34,0.05,109') #['12.45', '34', '0.05', '109']
注意:前面的*,+,?等都是貪婪匹配,也就是儘量匹配,後面加?號使其變成惰性匹配。
ret=re.findall('13\d+?','1312312312') print(ret) #['131']
轉義符 \
\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_] \b 匹配一個特殊字符邊界,好比空格 ,&,#等,
分組 ()
m = re.findall(r'(ad)+', 'add') print(m) #['ad'] ret = re.search('(?P<id>\d{2})/(?P<name>\w{3})', '23/com') print(ret.group()) # 23/com print(ret.group('id')) # 23
元字符之|
#匹配|左或|右的字符 ret=re.search('(ab)|\d','rabhdg8ab') print(ret.group())#ab
字符集[]
ret1 = re.findall('a[bc]d', 'acd') print(ret1) # ['acd'] ret2 = re.findall('[a-z]', 'acd') print(ret2) # ['a', 'c', 'd'] ret3 = re.findall('[.*+]', 'a.cd+') print(ret3) # ['.', '+'] # 在字符集裏有功能的符號: - ^ \ ret4 = re.findall('[1-9]', '45dha3') print(ret4) # ['4', '5', '3'] ret5 = re.findall('[^ab]', '45bdha3') print(ret5) # ['4', '5', 'd', 'h', '3'] ret6 = re.findall('[\d]', '45bdha3') print(ret6) # ['4', '5', '3']
經常使用方法
match() # 同search,不過僅在字符串開始處進行匹配
search() # 函數會在字符串內查找模式匹配,只到找到第一個匹配而後返回一個包含匹配信息的對象,該對象能夠經過調用group()方法獲得匹配的字符串,若是字符串沒有匹配,則返回None。
findall() # 返回全部知足匹配條件的結果,放在列表裏
split('[ab]', 'abcd') # 先按'a'分割獲得''和'bcd',在對''和'bcd'分別按'b'分割
sub('a','A','appleapc',2)) # AppleApc
ret = re.search('(?P<num>[0-9]{2})(?P<name>[a-z]+)','abc123zxy321').groupdict() #{'num': '23', 'name': 'zxy'}
幾個匹配模式
re.I(re.IGNORECASE): 忽略大小寫(括號內是完整寫法,下同) M(MULTILINE): 多行模式,改變'^'和'$'的行爲 S(DOTALL): 點任意匹配模式,改變'.'的行爲