OS 模塊
#getcwd() 獲取當(dāng)前工作目錄(當(dāng)前工作目錄默認(rèn)都是當(dāng)前文件所在的文件夾) result = os.getcwd() print(result) #chdir()改變當(dāng)前工作目錄 os.chdir('/home/sy') result = os.getcwd() print(result) open('02.txt','w') #操作時(shí)如果書(shū)寫(xiě)完整的路徑則不需要考慮默認(rèn)工作目錄的問(wèn)題,按照實(shí)際書(shū)寫(xiě)路徑操作 open('/home/sy/下載/02.txt','w') #listdir() 獲取指定文件夾中所有內(nèi)容的名稱列表 result = os.listdir('/home/sy') print(result) #mkdir() 創(chuàng)建文件夾 #os.mkdir('girls') #os.mkdir('boys',0o777) #makedirs() 遞歸創(chuàng)建文件夾 #os.makedirs('/home/sy/a/b/c/d') #rmdir() 刪除空目錄 #os.rmdir('girls') #removedirs 遞歸刪除文件夾 必須都是空目錄 #os.removedirs('/home/sy/a/b/c/d') #rename() 文件或文件夾重命名 #os.rename('/home/sy/a','/home/sy/alibaba' #os.rename('02.txt','002.txt') #stat() 獲取文件或者文件夾的信息 #result = os.stat('/home/sy/PycharmProject/Python3/10.27/01.py) #print(result) #system() 執(zhí)行系統(tǒng)命令(危險(xiǎn)函數(shù)) #result = os.system('ls -al') #獲取隱藏文件 #print(result) #環(huán)境變量 ''' 環(huán)境變量就是一些命令的集合 操作系統(tǒng)的環(huán)境變量就是操作系統(tǒng)在執(zhí)行系統(tǒng)命令時(shí)搜索命令的目錄的集合 ''' #getenv() 獲取系統(tǒng)的環(huán)境變量 result = os.getenv('PATH') print(result.split(':')) #putenv() 將一個(gè)目錄添加到環(huán)境變量中(臨時(shí)增加僅對(duì)當(dāng)前腳本有效) #os.putenv('PATH','/home/sy/下載') #os.system('syls') #exit() 退出終端的命令 #os模塊中的常用值 #curdir 表示當(dāng)前文件夾 .表示當(dāng)前文件夾 一般情況下可以省略 print(os.curdir) #pardir 表示上一層文件夾 ..表示上一層文件夾 不可省略! print(os.pardir) #os.mkdir('../../../man')#相對(duì)路徑 從當(dāng)前目錄開(kāi)始查找 #os.mkdir('/home/sy/man1')#絕對(duì)路徑 從根目錄開(kāi)始查找 #name 獲取代表操作系統(tǒng)的名稱字符串 print(os.name) #posix -> linux或者unix系統(tǒng) nt -> window系統(tǒng) #sep 獲取系統(tǒng)路徑間隔符號(hào) window ->\ linux ->/ print(os.sep) #extsep 獲取文件名稱和后綴之間的間隔符號(hào) window & linux -> . print(os.extsep) #linesep 獲取操作系統(tǒng)的換行符號(hào) window -> \r\n linux/unix -> \n print(repr(os.linesep)) #導(dǎo)入os模塊 import os #以下內(nèi)容都是os.path子模塊中的內(nèi)容 #abspath() 將相對(duì)路徑轉(zhuǎn)化為絕對(duì)路徑 path = './boys'#相對(duì) result = os.path.abspath(path) print(result) #dirname() 獲取完整路徑當(dāng)中的目錄部分 & basename()獲取完整路徑當(dāng)中的主體部分 path = '/home/sy/boys' result = os.path.dirname(path) print(result) result = os.path.basename(path) print(result) #split() 將一個(gè)完整的路徑切割成目錄部分和主體部分 path = '/home/sy/boys' result = os.path.split(path) print(result) #join() 將2個(gè)路徑合并成一個(gè) var1 = '/home/sy' var2 = '000.py' result = os.path.join(var1,var2) print(result) #splitext() 將一個(gè)路徑切割成文件后綴和其他兩個(gè)部分,主要用于獲取文件的后綴 path = '/home/sy/000.py' result = os.path.splitext(path) print(result) #getsize() 獲取文件的大小 #path = '/home/sy/000.py' #result = os.path.getsize(path) #print(result) #isfile() 檢測(cè)是否是文件 path = '/home/sy/000.py' result = os.path.isfile(path) print(result) #isdir() 檢測(cè)是否是文件夾 result = os.path.isdir(path) print(result) #islink() 檢測(cè)是否是鏈接 path = '/initrd.img.old' result = os.path.islink(path) print(result) #getctime() 獲取文件的創(chuàng)建時(shí)間 get create time #getmtime() 獲取文件的修改時(shí)間 get modify time #getatime() 獲取文件的訪問(wèn)時(shí)間 get active time import time filepath = '/home/sy/下載/chls' result = os.path.getctime(filepath) print(time.ctime(result)) result = os.path.getmtime(filepath) print(time.ctime(result)) result = os.path.getatime(filepath) print(time.ctime(result)) #exists() 檢測(cè)某個(gè)路徑是否真實(shí)存在 filepath = '/home/sy/下載/chls' result = os.path.exists(filepath) print(result) #isabs() 檢測(cè)一個(gè)路徑是否是絕對(duì)路徑 path = '/boys' result = os.path.isabs(path) print(result) #samefile() 檢測(cè)2個(gè)路徑是否是同一個(gè)文件 path1 = '/home/sy/下載/001' path2 = '../../../下載/001' result = os.path.samefile(path1,path2) print(result) #os.environ 用于獲取和設(shè)置系統(tǒng)環(huán)境變量的內(nèi)置值 import os #獲取系統(tǒng)環(huán)境變量 getenv() 效果 print(os.environ['PATH']) #設(shè)置系統(tǒng)環(huán)境變量 putenv() os.environ['PATH'] += ':/home/sy/下載' os.system('chls') os 常用方法 os.remove('path/filename’) 刪除文件 os.rename(oldname, newname) 重命名文件 os.walk() 生成目錄樹(shù)下的所有文件名 os.chdir('dirname') 改變目錄 os.mkdir/makedirs('dirname')創(chuàng)建目錄/多層目錄 os.rmdir/removedirs('dirname') 刪除目錄/多層目錄 os.listdir('dirname') 列出指定目錄的文件 os.getcwd() 取得當(dāng)前工作目錄 os.chmod() 改變目錄權(quán)限 os.path.basename('path/filename’) 去掉目錄路徑,返回文件名 os.path.dirname('path/filename’) 去掉文件名,返回目錄路徑 os.path.join(path1[,path2[,...]]) 將分離的各部分組合成一個(gè)路徑名 os.path.split('path') 返回( dirname(), basename())元組 os.path.splitext() 返回 (filename, extension) 元組 os.path.getatime\ctime\mtime 分別返回最近訪問(wèn)、創(chuàng)建、修改時(shí)間 os.path.getsize() 返回文件大小 os.path.exists() 是否存在 os.path.isabs() 是否為絕對(duì)路徑 os.path.isdir() 是否為目錄 os.path.isfile() 是否為文件
sys.argv 命令行參數(shù)List,第一個(gè)元素是程序本身路徑 sys.modules.keys() 返回所有已經(jīng)導(dǎo)入的模塊列表 sys.exc_info() 獲取當(dāng)前正在處理的異常類,exc_type、exc_value、exc_traceback當(dāng)前處理的異常詳細(xì)信息 sys.exit(n) 退出程序,正常退出時(shí)exit(0) sys.hexversion 獲取Python解釋程序的版本值,16進(jìn)制格式如:0x020403F0 sys.version 獲取Python解釋程序的版本信息 sys.maxint 最大的Int值 sys.maxunicode 最大的Unicode值 sys.modules 返回系統(tǒng)導(dǎo)入的模塊字段,key是模塊名,value是模塊 sys.path 返回模塊的搜索路徑,初始化時(shí)使用PYTHONPATH環(huán)境變量的值 sys.platform 返回操作系統(tǒng)平臺(tái)名稱 sys.stdout 標(biāo)準(zhǔn)輸出 sys.stdin 標(biāo)準(zhǔn)輸入 sys.stderr 錯(cuò)誤輸出 sys.exc_clear() 用來(lái)清除當(dāng)前線程所出現(xiàn)的當(dāng)前的或最近的錯(cuò)誤信息 sys.exec_prefix 返回平臺(tái)獨(dú)立的python文件安裝的位置 sys.byteorder 本地字節(jié)規(guī)則的指示器,big-endian平臺(tái)的值是'big',little-endian平臺(tái)的值是'little' sys.copyright 記錄python版權(quán)相關(guān)的東西 sys.api_version 解釋器的C的API版本
sys.stdin,sys.stdout,sys.stderr
stdin , stdout , 以及stderr 變量包含與標(biāo)準(zhǔn)I/O 流對(duì)應(yīng)的流對(duì)象. 如果需要更好地控制輸出,而print 不能滿足你的要求, 它們就是你所需要的. 你也可以替換它們, 這時(shí)候你就可以重定向輸出和輸入到其它設(shè)備( device ), 或者以非標(biāo)準(zhǔn)的方式處理它們
我們常用print和raw_input來(lái)進(jìn)行輸入和打印,那么 print 和 raw_input是如何與標(biāo)準(zhǔn)輸入/輸出流建立關(guān)系的呢?
其實(shí)Python程序的標(biāo)準(zhǔn)輸入/輸出/出錯(cuò)流定義在sys模塊中,分別 為: sys.stdin,sys.stdout, sys.stderr 下列的程序也可以用來(lái)輸入和輸出是一樣的: import sys
sys.stdout.write('HelloWorld!')
print 'Please enter yourname:',
name=sys.stdin.readline()[:-1]
print 'Hi, %s!' % name
那么sys.stdin, sys.stdout, stderr到底是什么呢?我們?cè)赑ython運(yùn)行環(huán)境中輸入以下代碼: import sys
for f in (sys.stdin,sys.stdout, sys.stderr): print f
輸出為:
<open file'<stdin>', mode 'r' at 892210>
<open file'<stdout>', mode 'w' at 892270>
<open file'<stderr>', mode 'w at 8922d0>
由此可以看出stdin, stdout, stderr在Python中無(wú)非都是文件屬性的對(duì)象,他們?cè)赑ython啟動(dòng)時(shí)自動(dòng)與Shell 環(huán)境中的標(biāo)準(zhǔn)輸入,輸出,出錯(cuò)關(guān)聯(lián)。 而Python程序的在Shell中的I/O重定向與本文開(kāi)始時(shí)舉的DOS命令的重定向完全相同,其實(shí)這種重定向是由Shell來(lái)提供的,與Python 本身并無(wú)關(guān)系。那么我們是否可以在Python程序內(nèi)部將stdin,stdout,stderr讀寫(xiě)操作重定向到一個(gè)內(nèi)部對(duì)象呢?答案是肯定的。 Python提供了一個(gè)StringIO模塊來(lái)完成這個(gè)設(shè)想,比如: from StringIO import StringIO import sys buff =StringIO() temp =sys.stdout #保存標(biāo)準(zhǔn)I/O流 sys.stdout =buff #將標(biāo)準(zhǔn)I/O流重定向到buff對(duì)象 print 42, 'hello', 0.001 sys.stdout=temp #恢復(fù)標(biāo)準(zhǔn)I/O流 print buff.getvalue()
time模塊
time模塊中時(shí)間表現(xiàn)的格式主要有三種: a、timestamp時(shí)間戳,時(shí)間戳表示的是從1970年1月1日00:00:00開(kāi)始按秒計(jì)算的偏移量 b、struct_time時(shí)間元組,共有九個(gè)元素組。 c、format time 格式化時(shí)間,已格式化的結(jié)構(gòu)使時(shí)間更具可讀性。包括自定義格式和固定格式。 1、時(shí)間格式轉(zhuǎn)換圖:
2、主要time生成方法和time格式轉(zhuǎn)換方法實(shí)例: #! /usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ = "TKQ"
import time # 生成timestamp time.time() # 1477471508.05 #生成struct_time
# timestamp to struct_time 本地時(shí)間
time.localtime()
time.localtime(time.time())
# time.struct_time(tm_year=2016, tm_mon=10, tm_mday=26, tm_hour=16, tm_min=45, tm_sec=8, tm_wday=2, tm_yday=300, tm_isdst=0) # timestamp to struct_time 格林威治時(shí)間 time.gmtime() time.gmtime(time.time()) # time.struct_time(tm_year=2016, tm_mon=10, tm_mday=26, tm_hour=8, tm_min=45, tm_sec=8, tm_wday=2, tm_yday=300, tm_isdst=0) #format_time to struct_time time.strptime('2011-05-05 16:37:06', '%Y-%m-%d %X') # time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=16, tm_min=37, tm_sec=6, tm_wday=3, tm_yday=125, tm_isdst=-1) #生成format_time #struct_time to format_time time.strftime("%Y-%m-%d %X") time.strftime("%Y-%m-%d %X",time.localtime()) # 2016-10-26 16:48:41 #生成固定格式的時(shí)間表示格式 time.asctime(time.localtime()) time.ctime(time.time()) # Wed Oct 26 16:45:08 2016
struct_time元組元素結(jié)構(gòu) 屬性 值
tm_year(年) 比如2011
tm_mon(月) 1 - 12
tm_mday(日) 1 - 31 tm_hour(時(shí)) 0 - 23 tm_min(分) 0 - 59 tm_sec(秒) 0 - 61 tm_wday(weekday) 0 - 6(0表示周日) tm_yday(一年中的第幾天) 1 - 366 tm_isdst(是否是夏令時(shí)) 默認(rèn)為-1
format time結(jié)構(gòu)化表示
常見(jiàn)結(jié)構(gòu)化時(shí)間組合: print time.strftime("%Y-%m-%d %X")
#2016-10-26 20:50:13
3、time加減 #timestamp加減單位以秒為單位
import time
t1 = time.time()
t2=t1+10
print time.ctime(t1)#Wed Oct 26 21:15:30 2016 print time.ctime(t2)#Wed Oct 26 21:15:40 2016
datetime模塊datatime模塊重新封裝了time模塊,提供更多接口,提供的類有:date,time,datetime,timedelta,tzinfo。 1、date類 datetime.date(year, month, day) 靜態(tài)方法和字段 date.max、date.min:date對(duì)象所能表示的最大、最小日期; date.resolution:date對(duì)象表示日期的最小單位。這里是天。 date.today():返回一個(gè)表示當(dāng)前本地日期的date對(duì)象; date.fromtimestamp(timestamp):根據(jù)給定的時(shí)間戮,返回一個(gè)date對(duì)象;
output
方法和屬性 d1 = date(2011,06,03)#date對(duì)象
d1.year、date.month、date.day:年、月、日;
d1.replace(year, month, day):生成一個(gè)新的日期對(duì)象,用參數(shù)指定的年,月,日代替原有對(duì)象中的屬性。(原有對(duì)象仍保持不變)
d1.timetuple():返回日期對(duì)應(yīng)的time.struct_time對(duì)象;
d1.weekday():返回weekday,如果是星期一,返回0;如果是星期2,返回1,以此類推;
d1.isoweekday():返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此類推;
d1.isocalendar():返回格式如(year,month,day)的元組;
d1.isoformat():返回格式如'YYYY-MM-DD’的字符串;
d1.strftime(fmt):和time模塊format相同。
output
2、time類 datetime.time(hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ) 靜態(tài)方法和字段 time.min、time.max:time類所能表示的最小、最大時(shí)間。其中,time.min = time(0, 0, 0, 0), time.max = time(23, 59, 59, 999999); time.resolution:時(shí)間的最小單位,這里是1微秒;
方法和屬性 t1 = datetime.time(10,23,15)#time對(duì)象
output
3、datetime類 datetime相當(dāng)于date和time結(jié)合起來(lái)。 靜態(tài)方法和字段 datetime.today():返回一個(gè)表示當(dāng)前本地時(shí)間的datetime對(duì)象; datetime.now([tz]):返回一個(gè)表示當(dāng)前本地時(shí)間的datetime對(duì)象,如果提供了參數(shù)tz,則獲取tz參數(shù)所指時(shí)區(qū)的本地時(shí)間; datetime.utcnow():返回一個(gè)當(dāng)前utc時(shí)間的datetime對(duì)象;#格林威治時(shí)間 datetime.fromtimestamp(timestamp[, tz]):根據(jù)時(shí)間戮創(chuàng)建一個(gè)datetime對(duì)象,參數(shù)tz指定時(shí)區(qū)信息; datetime.utcfromtimestamp(timestamp):根據(jù)時(shí)間戮創(chuàng)建一個(gè)datetime對(duì)象; datetime.combine(date, time):根據(jù)date和time,創(chuàng)建一個(gè)datetime對(duì)象; datetime.strptime(date_string, format):將格式字符串轉(zhuǎn)換為datetime對(duì)象;
output
方法和屬性 dt=datetime.now()#datetime對(duì)象
dt.year、month、day、hour、minute、second、microsecond、tzinfo:
dt.date():獲取date對(duì)象;
dt.time():獲取time對(duì)象;
dt. replace ([ year[ , month[ , day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] ] ] ]):
dt. timetuple ()
dt. utctimetuple ()
dt. toordinal ()
dt. weekday ()
dt. isocalendar ()
dt. isoformat ([ sep] )
dt. ctime ():返回一個(gè)日期時(shí)間的C格式字符串,等效于time.ctime(time.mktime(dt.timetuple()));
dt. strftime (format)
4.timedelta類,時(shí)間加減 使用timedelta可以很方便的在日期上做天days,小時(shí)hour,分鐘,秒,毫秒,微妙的時(shí)間計(jì)算,如果要計(jì)算月份則需要另外的辦法。 #coding:utf-8
from datetime import *
dt = datetime.now() #日期減一天 dt1 = dt + timedelta(days=-1)#昨天 dt2 = dt - timedelta(days=1)#昨天 dt3 = dt + timedelta(days=1)#明天 delta_obj = dt3-dt print type(delta_obj),delta_obj#<type 'datetime.timedelta'> 1 day, 0:00:00 print delta_obj.days ,delta_obj.total_seconds()#1 86400.0 5、tzinfo時(shí)區(qū)類 #! /usr/bin/python
# coding=utf-8
from datetime import datetime, tzinfo,timedelta <> tzinfo是關(guān)于時(shí)區(qū)信息的類 tzinfo是一個(gè)抽象類,所以不能直接被實(shí)例化 > class UTC(tzinfo): <>UTC> def init(self,offset = 0): self._offset = offset
#北京時(shí)間 beijing = datetime(2011,11,11,0,0,0,tzinfo = UTC(8)) print "beijing time:",beijing #曼谷時(shí)間 bangkok = datetime(2011,11,11,0,0,0,tzinfo = UTC(7)) print "bangkok time",bangkok #北京時(shí)間轉(zhuǎn)成曼谷時(shí)間 print "beijing-time to bangkok-time:",beijing.astimezone(UTC(7)) #計(jì)算時(shí)間差時(shí)也會(huì)考慮時(shí)區(qū)的問(wèn)題 timespan = beijing - bangkok print "時(shí)差:",timespan #Output================== # beijing time: 2011-11-11 00:00:00+08:00 # bangkok time 2011-11-11 00:00:00+07:00 # beijing-time to bangkok-time: 2011-11-10 23:00:00+07:00 # 時(shí)差: -1 day, 23:00:00 hashlib加密hashlib主要提供字符加密功能,將md5和sha模塊整合到了一起,支持md5,sha1, sha224, sha256, sha384, sha512等算法 具體應(yīng)用#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#pyversion:python3.5 #owner:fuzj
import hashlib # ######## md5 ######## string = "beyongjie" md5 = hashlib.md5() md5.update(string.encode('utf-8')) #注意轉(zhuǎn)碼 res = md5.hexdigest() print("md5加密結(jié)果:",res) # ######## sha1 ######## sha1 = hashlib.sha1() sha1.update(string.encode('utf-8')) res = sha1.hexdigest() print("sha1加密結(jié)果:",res) # ######## sha256 ######## sha256 = hashlib.sha256() sha256.update(string.encode('utf-8')) res = sha256.hexdigest() print("sha256加密結(jié)果:",res) # ######## sha384 ######## sha384 = hashlib.sha384() sha384.update(string.encode('utf-8')) res = sha384.hexdigest() print("sha384加密結(jié)果:",res) # ######## sha512 ######## sha512= hashlib.sha512() sha512.update(string.encode('utf-8')) res = sha512.hexdigest() print("sha512加密結(jié)果:",res)
輸出結(jié)果: md5加密結(jié)果: 0e725e477851ff4076f774dc312d4748 sha1加密結(jié)果: 458d32be8ea38b66300174970ab0a8c0b734252f sha256加密結(jié)果: 1e62b55bfd02977943f885f6a0998af7cc9cfb95c8ac4a9f30ecccb7c05ec9f4 sha384加密結(jié)果: e91cdf0d2570de5c96ee84e8a12cddf16508685e7a03b3e811099cfcd54b7f52183e20197cff7c07f312157f0ba4875b sha512加密結(jié)果: 3f0020a726e9c1cb5d22290c967f3dd1bcecb409a51a8088db520750c876aaec3f17a70d7981cd575ed4b89471f743f3f24a146a39d59f215ae3e208d0170073
注意:hashlib 加密啊的字符串類型為二進(jìn)制編碼,直接加密字符串會(huì)報(bào)如下錯(cuò)誤: sha1 = hashlib.sha1()
sha1.update(string)
res = sha1.hexdigest()
print("sha1加密結(jié)果:",res)
TypeError: Unicode-objects must be encoded before hashing
可以使用encode進(jìn)行轉(zhuǎn)換 shaa1 = hashlib.sha1()
shaa1.update(string.encode('utf-8'))
res = shaa1.hexdigest() print("sha1采用encode轉(zhuǎn)換加密結(jié)果:",res)
或者使用byte轉(zhuǎn)換為二進(jìn)制 shab1 = hashlib.sha1()
shab1.update(bytes(string,encoding='utf-8'))
res = shab1.hexdigest() print("sha1采用byte轉(zhuǎn)換的結(jié)果:",res)
以上輸出: sha1采用encode轉(zhuǎn)換加密結(jié)果: 458d32be8ea38b66300174970ab0a8c0b734252f sha1采用byte轉(zhuǎn)換的結(jié)果: 458d32be8ea38b66300174970ab0a8c0b734252f
常用方法
m = hashlib.md5()
m.update('a'.encode('utf-8')) res = m.hexdigest() print("第一次a加密:",res)
m.update('b'.encode('utf-8')) res = m.hexdigest() print("第二次b加密:",res) m1 = hashlib.md5() m1.update('b'.encode('utf-8')) res = m1.hexdigest() print("b單獨(dú)加密:",res) m2 = hashlib.md5() m2.update('ab'.encode('utf-8')) res = m2.hexdigest() print("ab單獨(dú)加密:",res) 輸出結(jié)果: 第一次a加密: 0cc175b9c0f1b6a831c399e269772661 第二次b加密: 187ef4436122d1cc2f40dc2b92f0eba0 b單獨(dú)加密: 92eb5ffee6ae2fec3ad71c777531578f ab單獨(dú)加密: 187ef4436122d1cc2f40dc2b92f0eba0
高級(jí)加密以上加密算法雖然依然非常厲害,但時(shí)候存在缺陷,即:通過(guò)撞庫(kù)可以反解。所以,有必要對(duì)加密算法中添加自定義key再來(lái)做加密。 low = hashlib.md5()
low.update('ab'.encode('utf-8')) res = low.hexdigest() print("普通加密:",res)
high = hashlib.md5(b'beyondjie') high.update('ab'.encode('utf-8')) res = high.hexdigest() print("采用key加密:",res) 輸出結(jié)果: 普通加密: 187ef4436122d1cc2f40dc2b92f0eba0 采用key加密: 1b073f6b8cffe609751e4c98537b7653
附加HMAC-SHA1各語(yǔ)言版本實(shí)現(xiàn)在各大開(kāi)放平臺(tái)大行其道的互聯(lián)網(wǎng)開(kāi)發(fā)潮流中,調(diào)用各平臺(tái)的API接口過(guò)程中,無(wú)一例外都會(huì)用到計(jì)算簽名值(sig值)。而在各種計(jì)算簽名的方法中,經(jīng)常被采用的就是HMAC-SHA1,現(xiàn)對(duì)HMAC-SHA1做一個(gè)簡(jiǎn)單的介紹:
Token:即接口的key data:要加密的數(shù)據(jù)
1 logging模塊簡(jiǎn)介logging模塊是Python內(nèi)置的標(biāo)準(zhǔn)模塊,主要用于輸出運(yùn)行日志,可以設(shè)置輸出日志的等級(jí)、日志保存路徑、日志文件回滾等;相比print,具備如下優(yōu)點(diǎn):
2 logging模塊使用2.1 基本使用配置logging基本的設(shè)置,然后在控制臺(tái)輸出日志, import logging logging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) logger.info("Start print log") logger.debug("Do something") logger.warning("Something maybe fail.") logger.info("Finish") 運(yùn)行時(shí),控制臺(tái)輸出,
logging中可以選擇很多消息級(jí)別,如debug、info、warning、error以及critical。通過(guò)賦予logger或者h(yuǎn)andler不同的級(jí)別,開(kāi)發(fā)者就可以只輸出錯(cuò)誤信息到特定的記錄文件,或者在調(diào)試時(shí)只記錄調(diào)試信息。 例如,我們將logger的級(jí)別改為DEBUG,再觀察一下輸出結(jié)果, logging.basicConfig(level = logging.DEBUG,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s') 控制臺(tái)輸出,可以發(fā)現(xiàn),輸出了debug的信息。
logging.basicConfig函數(shù)各參數(shù): filename:指定日志文件名; filemode:和file函數(shù)意義相同,指定日志文件的打開(kāi)模式,'w'或者'a'; format:指定輸出的格式和內(nèi)容,format可以輸出很多有用的信息,
datefmt:指定時(shí)間格式,同time.strftime(); level:設(shè)置日志級(jí)別,默認(rèn)為logging.WARNNING; stream:指定將日志的輸出流,可以指定輸出到sys.stderr,sys.stdout或者文件,默認(rèn)輸出到sys.stderr,當(dāng)stream和filename同時(shí)指定時(shí),stream被忽略; 2.2 將日志寫(xiě)入到文件2.2.1 將日志寫(xiě)入到文件 設(shè)置logging,創(chuàng)建一個(gè)FileHandler,并對(duì)輸出消息的格式進(jìn)行設(shè)置,將其添加到logger,然后將日志寫(xiě)入到指定的文件中, import logging logger = logging.getLogger(__name__) logger.setLevel(level = logging.INFO) handler = logging.FileHandler("log.txt") handler.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) logger.info("Start print log") logger.debug("Do something") logger.warning("Something maybe fail.") logger.info("Finish") log.txt中日志數(shù)據(jù)為,
2.2.2 將日志同時(shí)輸出到屏幕和日志文件 logger中添加StreamHandler,可以將日志輸出到屏幕上, import logging logger = logging.getLogger(__name__) logger.setLevel(level = logging.INFO) handler = logging.FileHandler("log.txt") handler.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) console = logging.StreamHandler() console.setLevel(logging.INFO) logger.addHandler(handler) logger.addHandler(console) logger.info("Start print log") logger.debug("Do something") logger.warning("Something maybe fail.") logger.info("Finish") 可以在log.txt文件和控制臺(tái)中看到,
可以發(fā)現(xiàn),logging有一個(gè)日志處理的主對(duì)象,其他處理方式都是通過(guò)addHandler添加進(jìn)去,logging中包含的handler主要有如下幾種,
2.2.3 日志回滾 使用RotatingFileHandler,可以實(shí)現(xiàn)日志回滾, import logging from logging.handlers import RotatingFileHandler logger = logging.getLogger(__name__) logger.setLevel(level = logging.INFO) #定義一個(gè)RotatingFileHandler,最多備份3個(gè)日志文件,每個(gè)日志文件最大1K rHandler = RotatingFileHandler("log.txt",maxBytes = 1*1024,backupCount = 3) rHandler.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') rHandler.setFormatter(formatter) console = logging.StreamHandler() console.setLevel(logging.INFO) console.setFormatter(formatter) logger.addHandler(rHandler) logger.addHandler(console) logger.info("Start print log") logger.debug("Do something") logger.warning("Something maybe fail.") logger.info("Finish") 可以在工程目錄中看到,備份的日志文件,
2.3 設(shè)置消息的等級(jí)可以設(shè)置不同的日志等級(jí),用于控制日志的輸出,
2.4 捕獲tracebackPython中的traceback模塊被用于跟蹤異常返回信息,可以在logging中記錄下traceback, 代碼, import logging logger = logging.getLogger(__name__) logger.setLevel(level = logging.INFO) handler = logging.FileHandler("log.txt") handler.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) console = logging.StreamHandler() console.setLevel(logging.INFO) logger.addHandler(handler) logger.addHandler(console) logger.info("Start print log") logger.debug("Do something") logger.warning("Something maybe fail.") try: open("sklearn.txt","rb") except (SystemExit,KeyboardInterrupt): raise except Exception: logger.error("Faild to open sklearn.txt from logger.error",exc_info = True) logger.info("Finish") 控制臺(tái)和日志文件log.txt中輸出,
也可以使用logger.exception(msg,_args),它等價(jià)于logger.error(msg,exc_info = True,_args), 將
替換為,
控制臺(tái)和日志文件log.txt中輸出,
2.5 多模塊使用logging主模塊mainModule.py, import logging import subModule logger = logging.getLogger("mainModule") logger.setLevel(level = logging.INFO) handler = logging.FileHandler("log.txt") handler.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) console = logging.StreamHandler() console.setLevel(logging.INFO) console.setFormatter(formatter) logger.addHandler(handler) logger.addHandler(console) logger.info("creating an instance of subModule.subModuleClass") a = subModule.SubModuleClass() logger.info("calling subModule.subModuleClass.doSomething") a.doSomething() logger.info("done with subModule.subModuleClass.doSomething") logger.info("calling subModule.some_function") subModule.som_function() logger.info("done with subModule.some_function") 子模塊subModule.py, import logging module_logger = logging.getLogger("mainModule.sub") class SubModuleClass(object): def init(self): self.logger = logging.getLogger("mainModule.sub.module") self.logger.info("creating an instance in SubModuleClass") def doSomething(self): self.logger.info("do something in SubModule") a = [] a.append(1) self.logger.debug("list a = " + str(a)) self.logger.info("finish something in SubModuleClass") def som_function(): module_logger.info("call function some_function") 執(zhí)行之后,在控制和日志文件log.txt中輸出,
首先在主模塊定義了logger'mainModule',并對(duì)它進(jìn)行了配置,就可以在解釋器進(jìn)程里面的其他地方通過(guò)getLogger('mainModule')得到的對(duì)象都是一樣的,不需要重新配置,可以直接使用。定義的該logger的子logger,都可以共享父logger的定義和配置,所謂的父子logger是通過(guò)命名來(lái)識(shí)別,任意以'mainModule'開(kāi)頭的logger都是它的子logger,例如'mainModule.sub'。 實(shí)際開(kāi)發(fā)一個(gè)application,首先可以通過(guò)logging配置文件編寫(xiě)好這個(gè)application所對(duì)應(yīng)的配置,可以生成一個(gè)根logger,如'PythonAPP',然后在主函數(shù)中通過(guò)fileConfig加載logging配置,接著在application的其他地方、不同的模塊中,可以使用根logger的子logger,如'PythonAPP.Core','PythonAPP.Web'來(lái)進(jìn)行l(wèi)og,而不需要反復(fù)的定義和配置各個(gè)模塊的logger。 3 通過(guò)JSON或者YAML文件配置logging模塊盡管可以在Python代碼中配置logging,但是這樣并不夠靈活,最好的方法是使用一個(gè)配置文件來(lái)配置。在Python 2.7及以后的版本中,可以從字典中加載logging配置,也就意味著可以通過(guò)JSON或者YAML文件加載日志的配置。 3.1 通過(guò)JSON文件配置JSON配置文件,
通過(guò)JSON加載配置文件,然后通過(guò)logging.dictConfig配置logging, import json import logging.config import os def setup_logging(default_path = "logging.json",default_level = logging.INFO,env_key = "LOG_CFG"): path = default_path value = os.getenv(env_key,None) if value: path = value if os.path.exists(path): with open(path,"r") as f: config = json.load(f) logging.config.dictConfig(config) else: logging.basicConfig(level = default_level) def func(): logging.info("start func")
if name == "main": setup_logging(default_path = "logging.json") func() 3.2 通過(guò)YAML文件配置通過(guò)YAML文件進(jìn)行配置,比JSON看起來(lái)更加簡(jiǎn)介明了,
通過(guò)YAML加載配置文件,然后通過(guò)logging.dictConfig配置logging, import yaml import logging.config import os def setup_logging(default_path = "logging.yaml",default_level = logging.INFO,env_key = "LOG_CFG"): path = default_path value = os.getenv(env_key,None) if value: path = value if os.path.exists(path): with open(path,"r") as f: config = yaml.load(f) logging.config.dictConfig(config) else: logging.basicConfig(level = default_level) def func(): logging.info("start func")
if name == "main": setup_logging(default_path = "logging.yaml") func()
subprocess模塊subprocess是Python 2.4中新增的一個(gè)模塊,它允許你生成新的進(jìn)程,連接到它們的 input/output/error 管道,并獲取它們的返回(狀態(tài))碼。這個(gè)模塊的目的在于替換幾個(gè)舊的模塊和方法,如:
1. subprocess模塊中的常用函數(shù)
2. 上面各函數(shù)的定義及參數(shù)說(shuō)明函數(shù)參數(shù)列表:
參數(shù)說(shuō)明:
3. subprocess.CompletedProcess類介紹需要說(shuō)明的是,subprocess.run()函數(shù)是Python3.5中新增的一個(gè)高級(jí)函數(shù),其返回值是一個(gè)subprocess.CompletedPorcess類的實(shí)例,因此,subprocess.completedPorcess類也是Python 3.5中才存在的。它表示的是一個(gè)已結(jié)束進(jìn)程的狀態(tài)信息,它所包含的屬性如下:
4. 實(shí)例subprocess.run()
subprocess.call()
suprocess.check_call()
sbuprocess.check_output()
subprocess.getoutput()與subprocess.getstatusoutput()
三、subprocess.Popen介紹該類用于在一個(gè)新的進(jìn)程中執(zhí)行一個(gè)子程序。前面我們提到過(guò),上面介紹的這些函數(shù)都是基于subprocess.Popen類實(shí)現(xiàn)的,通過(guò)使用這些被封裝后的高級(jí)函數(shù)可以很方面的完成一些常見(jiàn)的需求。由于subprocess模塊底層的進(jìn)程創(chuàng)建和管理是由Popen類來(lái)處理的,因此,當(dāng)我們無(wú)法通過(guò)上面哪些高級(jí)函數(shù)來(lái)實(shí)現(xiàn)一些不太常見(jiàn)的功能時(shí)就可以通過(guò)subprocess.Popen類提供的靈活的api來(lái)完成。 1.subprocess.Popen的構(gòu)造函數(shù)
參數(shù)說(shuō)明:
2. subprocess.Popen類的實(shí)例可調(diào)用的方法
關(guān)于communicate()方法的說(shuō)明:
3. subprocess.Popen使用實(shí)例實(shí)例1:
實(shí)例2:
實(shí)例3:
實(shí)例4:實(shí)現(xiàn)類似
四、總結(jié)那么我們到底該用哪個(gè)模塊、哪個(gè)函數(shù)來(lái)執(zhí)行命令與系統(tǒng)及系統(tǒng)進(jìn)行交互呢?下面我們來(lái)做個(gè)總結(jié):
json ,pickle模塊JSON(JavaScript Object Notation, JS 對(duì)象標(biāo)記) 是一種輕量級(jí)的數(shù)據(jù)交換格式。JSON的數(shù)據(jù)格式其實(shí)就是python里面的字典格式,里面可以包含方括號(hào)括起來(lái)的數(shù)組,也就是python里面的列表。 在python中,有專門(mén)處理json格式的模塊—— json 和 picle模塊 Json 模塊提供了四個(gè)方法: dumps、dump、loads、load
pickle 模塊也提供了四個(gè)功能:dumps、dump、loads、load
一. dumps 和 dump:
dumps和dump 序列化方法
dumps只完成了序列化為str,
dump必須傳文件描述符,將序列化的str保存到文件中
查看源碼:
def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, cls=None, indent=None, separators=None,
default=None, sort_keys=False, **kw):
# Serialize ``obj`` to a JSON formatted ``str``. # 序列號(hào) “obj” 數(shù)據(jù)類型 轉(zhuǎn)換為 JSON格式的字符串
def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, cls=None, indent=None, separators=None,
default=None, sort_keys=False, **kw):
"""Serialize ``obj`` as a JSON formatted stream to ``fp`` (a ``.write()``-supporting file-like object). 我理解為兩個(gè)動(dòng)作,一個(gè)動(dòng)作是將”obj“轉(zhuǎn)換為JSON格式的字符串,還有一個(gè)動(dòng)作是將字符串寫(xiě)入到文件中,也就是說(shuō)文件描述符fp是必須要的參數(shù) """
示例代碼: >>> import json
>>> json.dumps([]) # dumps可以格式化所有的基本數(shù)據(jù)類型為字符串
'[]' >>> json.dumps(1) # 數(shù)字 '1' >>> json.dumps('1') # 字符串 '"1"' >>> dict = {"name":"Tom", "age":23} >>> json.dumps(dict) # 字典 '{"name": "Tom", "age": 23}'
a = {"name":"Tom", "age":23} with open("test.json", "w", encoding='utf-8') as f: # indent 超級(jí)好用,格式化保存字典,默認(rèn)為None,小于0為零個(gè)空格 f.write(json.dumps(a, indent=4)) # json.dump(a,f,indent=4) # 和上面的效果一樣
保存的文件效果:
二. loads 和 load loads和load 反序列化方法
loads 只完成了反序列化,
load 只接收文件描述符,完成了讀取文件和反序列化
查看源碼: def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
"""Deserialize ``s`` (a ``str`` instance containing a JSON document) to a Python object.
將包含str類型的JSON文檔反序列化為一個(gè)python對(duì)象"""
def load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
"""Deserialize ``fp`` (a ``.read()``-supporting file-like object containing a JSON document) to a Python object.
將一個(gè)包含JSON格式數(shù)據(jù)的可讀文件飯序列化為一個(gè)python對(duì)象"""
實(shí)例: >>> json.loads('{"name":"Tom", "age":23}')
{'age': 23, 'name': 'Tom'}
import json
with open("test.json", "r", encoding='utf-8') as f: aa = json.loads(f.read()) f.seek(0) bb = json.load(f) # 與 json.loads(f.read()) print(aa) print(bb)
# 輸出: {'name': 'Tom', 'age': 23} {'name': 'Tom', 'age': 23} 三. json 和 pickle 模塊 json模塊和pickle模塊都有 dumps、dump、loads、load四種方法,而且用法一樣。 不用的是json模塊序列化出來(lái)的是通用格式,其它編程語(yǔ)言都認(rèn)識(shí),就是普通的字符串, 而picle模塊序列化出來(lái)的只有python可以認(rèn)識(shí),其他編程語(yǔ)言不認(rèn)識(shí)的,表現(xiàn)為亂碼 不過(guò)picle可以序列化函數(shù),但是其他文件想用該函數(shù),在該文件中需要有該文件的定義(定義和參數(shù)必須相同,內(nèi)容可以不同) 四. python對(duì)象(obj) 與json對(duì)象的對(duì)應(yīng)關(guān)系 +-------------------+---------------+ | Python | JSON | +===================+===============+ | dict | object | +-------------------+---------------+ | list, tuple | array | +-------------------+---------------+ | str | string | +-------------------+---------------+ | int, float | number | +-------------------+---------------+ | True | true | +-------------------+---------------+ | False | false | +-------------------+---------------+ | None | null | +-------------------+---------------+
五. 總結(jié) 1. json序列化方法: dumps:無(wú)文件操作 dump:序列化+寫(xiě)入文件 2. json反序列化方法: loads:無(wú)文件操作 load: 讀文件+反序列化 3. json模塊序列化的數(shù)據(jù) 更通用 picle模塊序列化的數(shù)據(jù) 僅python可用,但功能強(qiáng)大,可以序列號(hào)函數(shù) 4. json模塊可以序列化和反序列化的 數(shù)據(jù)類型 見(jiàn) python對(duì)象(obj) 與json對(duì)象的對(duì)應(yīng)關(guān)系表 5. 格式化寫(xiě)入文件利用 indent = 4 ElementTree是python的XML處理模塊
ElementTree是python的XML處理模塊,它提供了一個(gè)輕量級(jí)的對(duì)象模型。它在Python2.5以后成為Python標(biāo)準(zhǔn)庫(kù)的一部分,但是Python2.4之前需要單獨(dú)安裝。在使用ElementTree模塊時(shí),需要import xml.etree.ElementTree的操作。
ElementTree表示整個(gè)XML節(jié)點(diǎn)樹(shù),而Element表示節(jié)點(diǎn)數(shù)中的一個(gè)單獨(dú)的節(jié)點(diǎn)。
構(gòu)建
ElementTree(tag),其中tag表示根節(jié)點(diǎn),初始化一個(gè)ElementTree對(duì)象。
Element(tag, attrib={}, **extra)函數(shù)用來(lái)構(gòu)造XML的一個(gè)根節(jié)點(diǎn),其中tag表示根節(jié)點(diǎn)的名稱,attrib是一個(gè)可選項(xiàng),表示節(jié)點(diǎn)的屬性。
SubElement(parent, tag, attrib={}, **extra)用來(lái)構(gòu)造一個(gè)已經(jīng)存在的節(jié)點(diǎn)的子節(jié)點(diǎn)
Element.text和SubElement.text表示element對(duì)象的額外的內(nèi)容屬性,Element.tag和Element.attrib分別表示element對(duì)象的標(biāo)簽和屬性。
ElementTree.write(file, encoding='us-ascii', xml_declaration=None, default_namespace=None, method='xml'),函數(shù)新建一個(gè)XML文件,并且將節(jié)點(diǎn)數(shù)數(shù)據(jù)寫(xiě)入XML文件中。
#新建xml文件 def buildNewsXmlFile(): #設(shè)置一個(gè)新節(jié)點(diǎn),并設(shè)置其標(biāo)簽為root root = ET.Element("root")
解析和修改XML文件
ElementTree.parse(source, parser=None),將xml文件加載并返回ElementTree對(duì)象。parser是一個(gè)可選的參數(shù),如果為空,則默認(rèn)使用標(biāo)準(zhǔn)的XMLParser解析器。
ElementTree.getroot(),得到根節(jié)點(diǎn)。返回根節(jié)點(diǎn)的element對(duì)象。
Element.remove(tag),刪除root下名稱為tag的子節(jié)點(diǎn)
以下函數(shù),ElementTree和Element的對(duì)象都包含。
find(match),得到第一個(gè)匹配match的子節(jié)點(diǎn),match可以是一個(gè)標(biāo)簽名稱或者是路徑。返回個(gè)element
findtext(match,default=None),得到第一個(gè)配置的match的element的內(nèi)容
findall(match),得到匹配match下的所有的子節(jié)點(diǎn),match可以是一個(gè)標(biāo)簽或者是路徑,它會(huì)返回一個(gè)list,包含匹配的elements的信息
iter(tag),創(chuàng)建一個(gè)以當(dāng)前節(jié)點(diǎn)為根節(jié)點(diǎn)的iterator。
這里有一個(gè)xml文件
現(xiàn)在是解析xml文件的代碼
第一次的輸出是:1,2008,14100
第二次的輸出是:1,2008,14100,4,2011,59900,68,2011,13600
修改后的xml文件為
configparser 簡(jiǎn)介configparser 是 Pyhton 標(biāo)準(zhǔn)庫(kù)中用來(lái)解析配置文件的模塊,并且內(nèi)置方法和字典非常接近。Python2.x 中名為 ConfigParser,3.x 已更名小寫(xiě),并加入了一些新功能。
“[ ]”包含的為 section,section 下面為類似于 key - value 的配置內(nèi)容; configparser 常用方法初始化實(shí)例使用 configparser 首先需要初始化實(shí)例,并讀取配置文件:
或者可以直接讀字典
獲取所有 sections
獲取指定 section 的 keys & values
獲取指定 section 的 keys
獲取指定 key 的 value
檢查
添加
刪除
關(guān)于 [DEFAULT][DEFAULT] 一般包含 ini 格式配置文件的默認(rèn)項(xiàng),所以 configparser 部分方法會(huì)自動(dòng)跳過(guò)這個(gè) section 。
但指定刪除和修改 [DEFAULT] 里的 keys & values 是可以的:
還有個(gè)特殊的是,has_section() 也無(wú)效,可以和 in 區(qū)別使用
randmon(獲取隨機(jī)數(shù)) random.random random.uniform print random.uniform(10, 20) print random.uniform(20, 10) # 18.7356606526 # 12.5798298022 random.randint print random.randint(12, 20) # 生成的隨機(jī)數(shù) n: 12 <= n <= 20 print random.randint(20, 20) # 結(jié)果永遠(yuǎn)是20 # print random.randint(20, 10) # 該語(yǔ)句是錯(cuò)誤的。下限必須小于上限 random.randrange random.choice print random.choice("學(xué)習(xí)Python") print random.choice(["JGood", "is", "a", "handsome", "boy"]) print random.choice(("Tuple", "List", "Dict")) random.shuffle p = ["Python", "is", "powerful", "simple", "and so on..."] random.shuffle(p) print p # ['powerful', 'simple', 'is', 'Python', 'and so on...'] random.sample list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] slice = random.sample(list, 5) # 從list中隨機(jī)獲取5個(gè)元素,作為一個(gè)片斷返回 print slice print list # 原有序列并沒(méi)有改變
>>> import random
>>> random.randint(0,99) # 21 隨機(jī)選取0到100間的偶數(shù):
>>> import random
>>> random.randrange(0, 101, 2) # 42 隨機(jī)浮點(diǎn)數(shù):
>>> import random
>>> random.random() 0.85415370477785668 >>> random.uniform(1, 10) # 5.4221167969800881 隨機(jī)字符:
>>> import random
>>> random.choice('abcdefg&#%^*f') # 'd' 多個(gè)字符中選取特定數(shù)量的字符:
>>> import random
random.sample('abcdefghij', 3) # ['a', 'd', 'b'] 多個(gè)字符中選取特定數(shù)量的字符組成新字符串:
>>> import random
>>> import string >>> string.join( random.sample(['a','b','c','d','e','f','g','h','i','j'], 3) ).replace(" ","") # 'fih' 隨機(jī)選取字符串:
>>> import random
>>> random.choice ( ['apple', 'pear', 'peach', 'orange', 'lemon'] ) # 'lemon' 洗牌:
>>> import random
>>> items = [1, 2, 3, 4, 5, 6] >>> random.shuffle(items) >>> items # [3, 2, 5, 6, 4, 1]
shutil模塊
copy()
copy2()
copyfileobj()
copyfile()
copytree()
copymode()
copystat()
rmtree()
move()
which()
disk_usage()
歸檔和解包操作
make_archive()
unpack_archive()
get_archive_formats()
get_unpack_formats()
paramikoparamiko是一個(gè)用于做遠(yuǎn)程控制的模塊,使用該模塊可以對(duì)遠(yuǎn)程服務(wù)器進(jìn)行命令或文件操作,值得一說(shuō)的是,fabric和ansible內(nèi)部的遠(yuǎn)程管理就是使用的paramiko來(lái)現(xiàn)實(shí)。 1、下載安裝
2、模塊使用 #!/usr/bin/env python
#coding:utf-8
import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('192.168.1.108', 22, 'alex', '123') stdin, stdout, stderr = ssh.exec_command('df') print stdout.read() ssh.close(); import paramiko
private_key_path = '/home/auto/.ssh/id_rsa' key = paramiko.RSAKey.from_private_key_file(private_key_path) ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('主機(jī)名 ', 端口, '用戶名', key) stdin, stdout, stderr = ssh.exec_command('df') print stdout.read() ssh.close() import os,sys
import paramiko
t = paramiko.Transport(('182.92.219.86',22)) t.connect(username='wupeiqi',password='123') sftp = paramiko.SFTPClient.from_transport(t) sftp.put('/tmp/test.py','/tmp/test.py') t.close() import os,sys import paramiko t = paramiko.Transport(('182.92.219.86',22)) t.connect(username='wupeiqi',password='123') sftp = paramiko.SFTPClient.from_transport(t) sftp.get('/tmp/test.py','/tmp/test2.py') t.close() import paramiko
pravie_key_path = '/home/auto/.ssh/id_rsa' key = paramiko.RSAKey.from_private_key_file(pravie_key_path) t = paramiko.Transport(('182.92.219.86',22)) t.connect(username='wupeiqi',pkey=key) sftp = paramiko.SFTPClient.from_transport(t) sftp.put('/tmp/test3.py','/tmp/test3.py') t.close() import paramiko pravie_key_path = '/home/auto/.ssh/id_rsa' key = paramiko.RSAKey.from_private_key_file(pravie_key_path) t = paramiko.Transport(('182.92.219.86',22)) t.connect(username='wupeiqi',pkey=key) sftp = paramiko.SFTPClient.from_transport(t) sftp.get('/tmp/test3.py','/tmp/test4.py') t.close() requestsPython標(biāo)準(zhǔn)庫(kù)中提供了:urllib等模塊以供Http請(qǐng)求,但是,它的 API 太渣了。它是為另一個(gè)時(shí)代、另一個(gè)互聯(lián)網(wǎng)所創(chuàng)建的。它需要巨量的工作,甚至包括各種方法覆蓋,來(lái)完成最簡(jiǎn)單的任務(wù)。 import urllib.request
f = urllib.request.urlopen('http://www.//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508') result = f.read().decode('utf-8') import urllib.request
req = urllib.request.Request('http://www./') req.add_header('Referer', 'http://www./') r = urllib.request.urlopen(req) result = f.read().decode('utf-8') 注:更多見(jiàn)Python官方文檔:https://docs./3.5/library/urllib.request.html#module-urllib.request Requests 是使用 Apache2 Licensed 許可證的 基于Python開(kāi)發(fā)的HTTP 庫(kù),其在Python內(nèi)置模塊的基礎(chǔ)上進(jìn)行了高度的封裝,從而使得Pythoner進(jìn)行網(wǎng)絡(luò)請(qǐng)求時(shí),變得美好了許多,使用Requests可以輕而易舉的完成瀏覽器可有的任何操作。 1、安裝模塊
2、使用模塊 # 1、無(wú)參數(shù)實(shí)例
import requests
ret = requests.get('https://github.com/timeline.json') print(ret.url) print(ret.text) # 2、有參數(shù)實(shí)例 import requests payload = {'key1': 'value1', 'key2': 'value2'} ret = requests.get("http:///get", params=payload) print(ret.url) print(ret.text)
# 1、基本POST實(shí)例
import requests
payload = {'key1': 'value1', 'key2': 'value2'} ret = requests.post("http:///post", data=payload) print(ret.text) # 2、發(fā)送請(qǐng)求頭和數(shù)據(jù)實(shí)例 import requests import json url = 'https://api.github.com/some/endpoint' payload = {'some': 'data'} headers = {'content-type': 'application/json'} ret = requests.post(url, data=json.dumps(payload), headers=headers) print(ret.text) print(ret.cookies)
requests.get(url, params=None, **kwargs)
requests.post(url, data=None, json=None, **kwargs)
requests.put(url, data=None, **kwargs)
requests.head(url, **kwargs)
requests.delete(url, **kwargs)
requests.patch(url, data=None, **kwargs) requests.options(url, **kwargs) # 以上方法均是在此方法的基礎(chǔ)上構(gòu)建 requests.request(method, url, **kwargs)
更多requests模塊相關(guān)的文檔見(jiàn):http://cn./zh_CN/latest/ 3、Http請(qǐng)求和XML實(shí)例 實(shí)例:檢測(cè)QQ賬號(hào)是否在線 import urllib
import requests
from xml.etree import ElementTree as ET
# 使用內(nèi)置模塊urllib發(fā)送HTTP請(qǐng)求,或者XML格式內(nèi)容 <> f = urllib.request.urlopen('http://www.//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508') result = f.read().decode('utf-8') > # 使用第三方模塊requests發(fā)送HTTP請(qǐng)求,或者XML格式內(nèi)容 r = requests.get('http://www.//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508') result = r.text # 解析XML格式內(nèi)容 node = ET.XML(result) # 獲取內(nèi)容 if node.text == "Y": print("在線") else: print("離線") 實(shí)例:查看火車停靠信息 import urllib
import requests
from xml.etree import ElementTree as ET
# 使用內(nèi)置模塊urllib發(fā)送HTTP請(qǐng)求,或者XML格式內(nèi)容 <> f = urllib.request.urlopen('http://www./WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=') result = f.read().decode('utf-8') > # 使用第三方模塊requests發(fā)送HTTP請(qǐng)求,或者XML格式內(nèi)容 r = requests.get('http://www./WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=') result = r.text # 解析XML格式內(nèi)容 root = ET.XML(result) for node in root.iter('TrainDetailInfo'): print(node.find('TrainStation').text,node.find('StartTime').text,node.tag,node.attrib) 注:更多接口猛擊這里 paramiko模塊
import paramiko
# 創(chuàng)建SSH對(duì)象 ssh = paramiko.SSHClient() # 允許連接不在known_hosts文件上的主機(jī) ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 連接服務(wù)器 ssh.connect(hostname="192.168.0.99", port=22, username="root", password="rootroot") # 執(zhí)行命令 stdin, stdout, stderr = ssh.exec_command('df') # 獲取結(jié)果 result = stdout.read().decode() # 獲取錯(cuò)誤提示(stdout、stderr只會(huì)輸出其中一個(gè)) err = stderr.read() # 關(guān)閉連接 ssh.close() print(stdin, result, err) 注:如果注釋“ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())”這句,會(huì)報(bào)錯(cuò)。 類似問(wèn)題可以為linux系統(tǒng)中~/.ssh/known_hosts文件中的內(nèi)容。 二、實(shí)現(xiàn)SFTP功能 import paramiko
# 連接虛擬機(jī)centos上的ip及端口
transport = paramiko.Transport(("192.168.0.99", 22)) transport.connect(username="root", password="rootroot") # 將實(shí)例化的Transport作為參數(shù)傳入SFTPClient中 sftp = paramiko.SFTPClient.from_transport(transport) # 將“calculator.py”上傳到filelist文件夾中 sftp.put('D:\python庫(kù)\Python_shell\day05\calculator.py', '/filelist/calculator.py') # 將centos中的aaa.txt文件下載到桌面 sftp.get('/filedir/aaa.txt', r'C:\Users\duany_000\Desktop\test_aaa.txt') transport.close()
注:如果遇到Windows中路徑問(wèn)題,鏈接如下網(wǎng)址http://blog.csdn.net/elang6962/article/details/68068126 三、使用秘鑰實(shí)現(xiàn)SSH功能 import paramiko
private_key = paramiko.RSAKey.from_private_key_file('id_rsa31') # 創(chuàng)建SSH對(duì)象 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 連接服務(wù)器 ssh.connect(hostname='192.168.79.9', port=22, username='root', pkey=private_key) stdin, stdout, stderr = ssh.exec_command('ifconfig') res_out = stdout.read() print(res_out.decode()) ssh.close()
四、使用秘鑰實(shí)現(xiàn)SFTP功能 import paramiko
private_key = paramiko.RSAKey.from_private_key_file('id_rsa31') # 連接虛擬機(jī)centos上的ip及端口 transport = paramiko.Transport(("192.168.79.9", 22)) transport.connect(username="root", pkey=private_key) # 將實(shí)例化的Transport作為參數(shù)傳入SFTPClient中 sftp = paramiko.SFTPClient.from_transport(transport) # 將“calculator.py”上傳到filelist文件夾中 sftp.put('D:\python庫(kù)\Python_shell\day05\calculator.py', '/filedir/calculator.py') # 將centos中的aaa.txt文件下載到桌面 sftp.get('/filedir/oldtext.txt', r'C:\Users\duany_000\Desktop\oldtext.txt') transport.close()
|
|