模塊:用一部分代碼實現了某個功能的代碼集合,相似於函數式編程,定義一個函數完成某個功能呢,其餘代碼用來調用便可,提供了代碼的重用性和代碼間的耦合。而對於一個複雜的功能來,可能須要多個函數才能完成;python
模塊分爲三種:自定義模塊、第三方模塊、內置模塊正則表達式
用於提供對Python解釋器相關的操做:算法
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 返回操做系統平臺名稱 7 sys.stdin 輸入相關 8 sys.stdout 輸出相關 9 sys.stderror 錯誤相關
用於提供系統級別的操做:shell
1 os.getcwd() 獲取當前工做目錄,即當前python腳本工做的目錄路徑 2 os.chdir("dirname") 改變當前腳本工做目錄;至關於shell下cd 3 os.curdir 返回當前目錄: ('.') 4 os.pardir 獲取當前目錄的父目錄字符串名:('..') 5 os.makedirs('dir1/dir2') 可生成多層遞歸目錄 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","new") 重命名文件/目錄 12 os.stat('path/filename') 獲取文件/目錄信息 13 os.sep 操做系統特定的路徑分隔符,win下爲"\\",Linux下爲"/" 14 os.linesep 當前平臺使用的行終止符,win下爲"\t\n",Linux下爲"\n" 15 os.pathsep 用於分割文件路徑的字符串 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所指向的文件或者目錄的最後修改時間
經常使用表示時間方式: 時間戳,格式化的時間字符串,元組(struct_time)編程
# struct_time轉換成format_time %a 本地(locale)簡化星期名稱 %A 本地完整星期名稱 %b 本地簡化月份名稱 %B 本地完整月份名稱 %c 本地相應的日期和時間表示 %d 一個月中的第幾天(01 - 31) %H 一天中的第幾個小時(24小時制,00 - 23) %I 第幾個小時(12小時制,01 - 12) %j 一年中的第幾天(001 - 366) %m 月份(01 - 12) %M 分鐘數(00 - 59) %p 本地am或者pm的相應符 一 %S 秒(01 - 61) 二 %U 一年中的星期數。(00 - 53星期天是一個星期的開始。)第一個星期天以前的全部天數都放在第0周。 %w 一個星期中的第幾天(0 - 6,0是星期天) 三 %W 和%U基本相同,不一樣的是%W以星期一爲一個星期的開始。 %x 本地相應日期 %X 本地相應時間 %y 去掉世紀的年份(00 - 99) %Y 完整的年份 %Z 時區的名字(若是不存在爲空字符) %% ‘%’字符
實例:結合sys,time模塊實現進度條json
進度百分比
import sys import time def view_bar(num, total): rate = float(num) / float(total) rate_num = int(rate * 100) r = '\r%d%%' % (rate_num, ) sys.stdout.write(r) sys.stdout.flush() if __name__ == '__main__': for i in range(0, 100): time.sleep(0.1) view_bar(i, 100)
random.random() # 0~1 隨機浮點數 random.randint(1,100) #隨機整數1~100 random.randrange(1,7) #隨機整數,不包括7 random.choice('hello world') #隨機獲取一個字符 random.choice(['1','2','3',]) #隨機獲取一個元素 random.sample([1,2,3,4,5],3) #random.sample的函數原型爲:random.sample(sequence, k)從指定序列中隨機獲取指定長度的片
實例:生成隨機驗證碼安全
版本一:bash
import random def check_code(): check_code = "" for i in range(4): num = random.randint(0,9) #隨機選擇0~9 A1Z1 = chr(random.randint(65,90)) #隨機選擇A~Z a1z1 = chr(random.randint(97,122)) #隨機選擇a~z add = random.choice([num,A1Z1,a1z1]) #隨機選擇其中一個 check_code = "".join([code,str(add)]) #拼接一次選到的元素 return check_code #返回驗證碼# print(check_code())
版本二:服務器
import random checkcode = '' for i in range(4): current = random.randrange(0,4) if current != i: temp = chr(random.randint(65,90)) else: temp = random.randint(0,9) checkcode += str(temp) print checkcode
python中re模塊提供了正則表達式相關操做網絡
1 次數: 2 * 重複零次或更屢次 3 + 重複一次或更屢次 4 ? 重複零次或一次 5 {n} 重複n次 6 {n,} 重複n次或更屢次 7 {n,m} 重複n到m次
其中提供的方法有:
match、search、findall、sub、split
import re #1 print(re.findall('e','clint love you') ) #['e', 'e'],返回全部知足匹配條件的結果,放在列表裏 #2 print(re.search('e','clint love you').group()) #e,只到找到第一個匹配而後返回一個包含匹配信息的對象,該對象能夠經過調用group()方法獲得匹配的字符串,若是字符串沒有匹配,則返回None。 #3 print(re.match('e','clint love you')) #None,同search,不過在字符串開始處進行匹配,徹底能夠用search+^代替match #4 print(re.split('[ab]','abcd')) #['', '', 'cd'],先按'a'分割獲得''和'bcd',再對''和'bcd'分別按'b'分割 #5 print('===>',re.sub('c','C','clint love you')) #===> Clint love you,不指定n,默認替換全部 print('===>',re.sub('l','L','clint love you',1)) #===> cLint love you print('===>',re.subn('c','C','clint love you')) #===> ('Alex mAke love', 2),結果帶有總共替換的個數 #6 obj=re.compile('\d{2}') print(obj.search('abc123eeee').group()) #12 print(obj.findall('abc123eeee')) #['12'],重用了obj
幾個匹配的實用例子:
# 郵箱表達式 email = r'^[a-aA-Z0-9_-]+@[a-aA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$' # 例如: # clint1801@163.com # 472400995@qq.com # s180231943@stu.cqupt.edu.cn 企業郵箱 ''' 你會發現 後面 \. 這是什麼意思? 由於 . 表示匹配任意除換行符"\n"外的字符,而咱們要匹配郵箱中的 . 因此 須要用到 \ \ 表示轉義字符 注: 小括號():匹配小括號內的字符串 中括號[]:匹配字符組內的字符 大括號{}:匹配的次數 '''
# 手機號表達式 phone = r'^1[3578]\d{9}$'
IP的正則表達式:
這裏講的是IPv4的地址格式,總長度 32位=4段*8位,每段之間用 . 分割, 每段都是0-255之間的十進制數值。
將0-255用正則表達式表示,能夠分紅一下幾塊來分別考慮:
IP地址格式可表示爲:XXX.XXX.XXX.XXX,XXX取值範圍是0-255,前三段加一個.重複了三次,再與最後一段合併 或者 前一段與加 . 重複三次的後三段合併,組成IP地址的完整格式。
# IP地址 正則表達以下: 1、 ip =r'^((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))$' 2、 ip = r'^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$'
高級的 文件、文件夾、壓縮包 處理模塊
shutil.copyfileobj(fsrc, fdst[, length]) 將文件內容拷貝到另外一個文件中
import shutil shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))
shutil.copyfile(src, dst) 拷貝文件
shutil.copyfile('f1.log', 'f2.log')
shutil.copymode(src, dst) 僅拷貝權限。內容、組、用戶均不變
shutil.copymode('f1.log', 'f2.log')
shutil.copystat(src, dst) 僅拷貝狀態的信息,包括:mode bits, atime, mtime, flags
shutil.copymode('f1.log', 'f2.log')
shutil.copy(src, dst) 拷貝文件和權限
shutil.copymode('f1.log', 'f2.log')
shutil.copy2(src, dst) 拷貝文件和狀態信息
shutil.copy2('f1.log', 'f2.log')
shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None) 遞歸的去拷貝文件夾
shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
shutil.rmtree(path[, ignore_errors[, onerror]]) 遞歸的去刪除文件
shutil.rmtree('folder1')
shutil.move(src, dst)
遞歸的去移動文件,它相似mv命令,其實就是重命名。
shutil.make_archive(base_name, format,...)
建立壓縮包並返回文件路徑,例如:zip、tar
建立壓縮包並返回文件路徑,例如:zip、tar
# 將 /DjangoProJ/a/test 下的文件打包放置當前程序目錄 import shutil ret = shutil.make_archive("cc", 'gztar', root_dir='/DjangoProJ/a/test') # 將 /DjangoProJ/a/test 下的文件打包放置 /DjangoProJ/a/目錄 import shutil ret = shutil.make_archive("/DjangoProJ/a/cc", 'gztar', root_dir='/DjangoProJ/a/test ')
用於加密相關的操做,代替了md5模塊和sha模塊,主要提供 sha1, sha224, sha256, sha384, sha512, blake2b, blake2s和MD5等;
特色:
1.內容相同則hash運算結果相同,內容改變則hash值則改變
2.不可逆推
3.相同算法:不管校驗多長的數據,獲得的哈希值長度固定。
import hashlib # ######## md5 ######## hash = hashlib.md5(bytes('898oaFs09f',encoding="utf-8")) hash.update(bytes('admin',encoding="utf-8")) print(hash.hexdigest())
什麼是序列化?
咱們把對象(變量)從內存中變成可存儲或傳輸的過程稱之爲序列化
爲何要序列化?
持久保存狀態:
'狀態'會以各類有結構的數據類型形式被保存在內存中;
內存是沒法永久保存數據的,程序運行了一段時間,斷電或者重啓內存則會清空程序這段段時間保存的數據;
在斷電或重啓程序以前將程序當前內存中全部的數據都保存下來(保存到文件中),下次程序執行可以從文件中載入以前的數據繼續執行,這就是序列化。
跨平臺數據交互:
序列化以後,不只能夠把序列化後的內容寫入磁盤,還能夠經過網絡傳輸到別的機器上,若是收發的雙方約定好實用一種序列化的格式,那麼打破了平臺/語言差別化帶來的限制,實現了跨平臺數據交互。
把變量內容從序列化的對象從新讀到內存裏稱之爲反序列化,即unpickling;
Python中用於序列化的兩個模塊:json(用於【字符串】和 【python基本數據類型】 間進行轉換)、pickle(用於【python特有的類型】 和 【python基本數據類型】間進行轉換)
Json有四個功能:dumps、dump、loads、load
pickle也有四個功能:dumps、dump、loads、load
import json dic={'name':'clint','age':18,'sex':'男'} print(type(dic)) #<class 'dict'> j=json.dumps(dic) print(type(j)) #<class 'str'> f=open('序列化對象','w') json.dump(dic,f) f.close()
序列化和反序列化
import json # 序列化 info = {'name':'clint','age':'18'} with open('a','w') as f: f.write(json.dumps(info)) # 反序列化 with open('a','r') as f: info = json.loads(f.read()) print(info)
import pickle dic={'name':'clint','age':18,'sex':'男'} print(type(dic)) #<class 'dict'> j=pickle.dumps(dic) print(type(j)) #<class 'bytes'> f=open('序列化對象_pickle','wb') #wb是寫入bytes,j是'bytes' pickle.dump(dic,f) f.close() # 反序列化 import pickle f=open('序列化對象_pickle','rb') data=pickle.loads(f.read()) # 等data=pickle.load(f) print(data['age'])
configparser用於生成和修改常見配置文檔,其本質上是利用open來操做文件
一、獲取全部節點
import configparser config = configparser.ConfigParser() config.read('xxxooo', encoding='utf-8') ret = config.sections() print(ret)
二、獲取指定節點全部鍵值對
import configparser config = configparser.ConfigParser() config.read('xxxooo', encoding='utf-8') ret = config.items('section1') print(ret)
三、獲取指定節點下全部鍵
import configparser config = configparser.ConfigParser() config.read('xxxooo', encoding='utf-8') ret = config.options('section1') print(ret)
四、增刪改查節點
import configparser config = configparser.ConfigParser() config.read('example.ini',encoding = 'utf-8') #刪除整個標題 config.remove_section('bitbucket.org') #刪除標題下的option config.remove_option('topsecret.server.com','port') #添加一個標題 config.add_section('info') #在標題下添加options config.set('info','name','clint') #判斷是否存在 print(config.has_section('info')) #True print(config.has_option('info','name')) #True #將修改的內容存入文件 config.write(open('new_example.ini','w'))
paramiko是一個用於作遠程控制的模塊,使用該模塊能夠對遠程服務器進行命令或文件操做,fabric和ansible內部的遠程管理就是使用paramiko
下載安裝:
# paramiko 模塊內部依賴pycrypto,因此先下載安裝pycrypto pip3 install pycrypto pip3 install paramiko
使用:
# -*- coding:utf-8 -*- # @Author : Clint import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('192.168.178.1', 8000, 'clint', '123456') stdin, stdout, stderr = ssh.exec_command('df') print(stdout.read()) ssh.close() # 執行命令 - 用戶名+密碼
shelve模塊比pickle模塊簡單,只有一個open函數,返回相似字典的對象,可讀可寫,key必須爲字符串,而值能夠是python所支持的數據類型
import shelve f=shelve.open(r'sheve.txt') # f['stu1']={'name':'clint','age':18,'hobby':['basketball','sporting']} # f['stu2']={'name':'eve','age':18,'hobby':'watching movie'} print(f['stu1']['hobby']) f.close()
用於便捷記錄日誌且線程安全的模塊,python的logging模塊提供了標準的日誌接口,經過它存儲各類格式的日誌,logging的日誌能夠分爲 debug、info、warning、error、critical5個級別
# -*- coding:utf-8 -*- # @Author : Clint import logging logging.basicConfig(filename='log.log', format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S %p', level=10) logging.debug('debug') logging.info('info') logging.warning('warning') logging.error('error') logging.critical('critical') logging.log(10, 'log')
2019-05-18 10:01:23 AM - root - DEBUG -logg: debug 2019-05-18 10:01:23 AM - root - INFO -logg: info 2019-05-18 10:01:23 AM - root - WARNING -logg: warning 2019-05-18 10:01:23 AM - root - ERROR -logg: error 2019-05-18 10:01:23 AM - root - CRITICAL -logg: critical 2019-05-18 10:01:23 AM - root - DEBUG -logg: log