Python的常用模块
目錄:
- time模塊
- random()模塊
- os模塊
- sys模塊
- Json模塊
- hashlib 模塊
- subprocess模塊
- paramiko模塊
- re模塊
time模塊
time()模塊中的重要函數
time()模塊時間格式轉換
time()模塊時間轉換
- 時間戳 1970年1月1日之后的秒, 即:time.time()
- 格式化的字符串 2014-11-11 11:11, 即:time.strftime(’%Y-%m-%d’)
- 結構化時間 元組包含了:年、日、星期等… time.struct_time 即:time.localtime()
time模塊時間轉換
import time print(time.time()) # 時間戳:1511166937.2178104 print(time.strftime('%Y-%m-%d')) # 格式化的字符串: 2017-11-20 print(time.localtime()) # 結構化時間(元組): (tm_year=2017, tm_mon=11...) print(time.gmtime()) # 將時間轉換成utc格式的元組格式: (tm_year=2017, tm_mon=11...)#1. 將結構化時間轉換成時間戳: 1511167004.0 print(time.mktime(time.localtime()))#2. 將格字符串時間轉換成結構化時間 元組: (tm_year=2017, tm_mon=11...) print(time.strptime('2014-11-11', '%Y-%m-%d'))#3. 結構化時間(元組) 轉換成 字符串時間 :2017-11-20 print(time.strftime('%Y-%m-%d', time.localtime())) # 默認當前時間#4. 將結構化時間(元組) 轉換成英文字符串時間 : Mon Nov 20 16:51:28 2017 print(time.asctime(time.localtime()))#5. 將時間戳轉成 英文字符串時間 : Mon Nov 20 16:51:28 2017 print(time.ctime(time.time()))datetime獲取時間
import datetime #1、datetime.datetime獲取當前時間 print(datetime.datetime.now()) #2、獲取三天后的時間 print(datetime.datetime.now()+datetime.timedelta(+3)) #3、獲取三天前的時間 print(datetime.datetime.now()+datetime.timedelta(-3)) #4、獲取三個小時后的時間 print(datetime.datetime.now()+datetime.timedelta(hours=3)) #5、獲取三分鐘以前的時間 print(datetime.datetime.now()+datetime.timedelta(minutes = -3))import datetime print(datetime.datetime.now()) #2017-08-18 11:25:52.618873 print(datetime.datetime.now().date()) #2017-08-18 print(datetime.datetime.now().strftime("%Y-%m-%d %H-%M-%S")) #2017-08-18 11-25-52random()模塊
random()模塊常用函數
random常用函數舉例
使用random實現四位驗證碼
- 使用for循環實現
- 使用random.sample實現
os模塊
os模塊常用方法
import os #1 當前工作目錄,即當前python腳本工作的目錄路徑 print(os.getcwd()) # C:\Users\admin\PycharmProjects\s14\Day5\test4#2 當前腳本工作目錄;相當于shell下cd os.chdir("C:\\Users\\admin\\PycharmProjects\\s14") os.chdir(r"C:\Users\admin\PycharmProjects\s14") print(os.getcwd()) # C:\Users\admin\PycharmProjects\s14#3 返回當前目錄: ('.') print(os.curdir) # ('.')#4 獲取當前目錄的父目錄字符串名:('..') print(os.pardir) # ('..')#5 可生成多層遞歸目錄 os.makedirs(r'C:\aaa\bbb') # 可以發現在C盤創建了文件夾/aaa/bbb#6 若目錄為空,則刪除,并遞歸到上一級目錄,如若也為空,則刪除,依此類推 os.removedirs(r'C:\aaa\bbb') # 刪除所有空目錄#7 生成單級目錄;相當于shell中mkdir dirname os.mkdir(r'C:\bbb') # 僅能創建單個目錄#8 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當于shell中rmdir dirname os.rmdir(r'C:\aaa') # 僅刪除指定的一個空目錄#9 列出指定目錄下的所有文件和子目錄,包括隱藏文件,并以列表方式打印 print(os.listdir(r"C:\Users\admin\PycharmProjects\s14"))#10 刪除一個文件 os.remove(r'C:\bbb\test.txt') # 指定刪除test.txt文件#11 重命名文件/目錄 os.rename(r'C:\bbb\test.txt',r'C:\bbb\test00.bak')#12 獲取文件/目錄信息 print(os.stat(r'C:\bbb\test.txt'))#13 輸出操作系統特定的路徑分隔符,win下為"\\",Linux下為"/" print(os.sep) # \#14 輸出當前平臺使用的行終止符,win下為"\r\n",Linux下為"\n" print(os.linesep)#15 輸出用于分割文件路徑的字符串 print(os.pathsep) # ; (分號)#16 輸出字符串指示當前使用平臺。win->'nt'; Linux->'posix' print(os.name) # nt#17 運行shell命令,直接顯示 os.system("bash command")#18 獲取系統環境變量 print(os.environ) # environ({'OS': 'Windows_NT', 'PUBLIC': ………….#19 返回path規范化的絕對路徑 print(os.path.abspath(r'C:/bbb/test.txt')) # C:\bbb\test.txt#20 將path分割成目錄和文件名二元組返回 print(os.path.split(r'C:/bbb/ccc')) # ('C:/bbb', 'ccc')#21 返回path的目錄。其實就是os.path.split(path)的第一個元素 print(os.path.dirname(r'C:/bbb/ccc')) # C:/bbb#22 返回path最后的文件名。如何path以/或\結尾,那么就會返回空值。即os.path.split(path)的第二個元素 print(os.path.basename(r'C:/bbb/ccc/ddd')) # ddd#23 如果path存在,返回True;如果path不存在,返回False print(os.path.exists(r'C:/bbb/ccc/')) # True#24 如果path是絕對路徑,返回True # True print(os.path.isabs(r"C:\Users\admin\PycharmProjects\s14\Day5\test4"))#25 如果path是一個存在的文件,返回True。否則返回False print(os.path.isfile(r'C:/bbb/ccc/test2.txt')) # True#26 如果path是一個存在的目錄,則返回True。否則返回False print(os.path.isdir(r'C:/bbb/ccc')) # True#28 返回path所指向的文件或者目錄的最后存取時間 print(os.path.getatime(r'C:/bbb/ccc/test2.txt')) # 1483509254.9647143#29 返回path所指向的文件或者目錄的最后修改時間 print(os.path.getmtime(r'C:/bbb/ccc/test2.txt')) # 1483510068.746478#30 無論linux還是windows,拼接出文件路徑 put_filename = '%s%s%s'%(self.home,os. path.sep, filename) #C:\Users\admin\PycharmProjects\s14\day10select版FTP\homeos命令創建文件夾并寫入文件file.txt文件
import osos.makedirs('C:/aaa/bbb/ccc/ddd',exist_ok=True) # exist_ok=True:如果存在當前文件夾不報錯 path = os.path.join('C:/aaa/bbb/ccc','ddd',) f_path = os.path.join(path,'file.txt')with open(f_path,'w',encoding='utf8') as f:f.write('are you ok!!')os.popen獲取腳本執行結果
data.py
data = {'name':'aaa'} import json print json.dumps(data)get_data.py
#! /usr/bin/env python # -*- coding: utf-8 -*- import os,jsonret = os.popen('python data.py') data = ret.read().strip() ret.close() data = json.loads(data) print data # {'name':'aaa'}sys模塊
sys.argv 返回執行腳本傳入的參數sys.exit(n) 退出程序,正常退出時exit(0)sys.version 獲取Python解釋程序的版本信息sys.maxint 最大的Int值sys.path 返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值sys.platform 返回操作系統平臺名稱sys.stdout.write('please:')val = sys.stdin.readline()[:-1]使用sys.argv返回執行腳本傳入的參數
import sys # C:\Users\tom\PycharmProjects\s14Review\day01> python test01.py 1 2 3 print(sys.argv) # 打印所有參數 ['test01.py', '1', '2', '3'] print(sys.argv[1:]) # 獲取索引 1 往后的所有參數 ['1', '2', '3']Json模塊
json序列化
- 序列化 (json.dumps) :是將內存中的對象存儲到硬盤,變成字符串
- 反序列化(json.loads) : 將剛剛保存在硬盤中的內存對象從新加載到內存中
- json.dumps( data,ensure_ascii=False, indent=4)
json序列化
#json序列化代碼 import json info = {'name':"tom","age" :"100" } f = open("test.txt",'w') # print(json.dumps(info)) f.write(json.dumps(info)) f.close()json反序列化
#json反序列化代碼 import json f = open("test.txt","r") data = json.loads(f.read()) f.close() print(data["age"])解決Json不可序列化datetime類型
import json,datetimeclass JsonCustomEncoder(json.JSONEncoder):def default(self, field):if isinstance(field, datetime.datetime):return field.strftime('%Y-%m-%d %H:%M:%S')elif isinstance(field, datetime.date):return field.strftime('%Y-%m-%d')else:return json.JSONEncoder.default(self, field)t = datetime.datetime.now()print(type(t),t) f = open('ttt','w') #指定將內容寫入到ttt文件中 f.write(json.dumps(t,cls=JsonCustomEncoder)) #使用時候只要在json.dumps增加個cls參數即可hashlib 模塊
用于加密相關的操作,代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
常見的五種加密方式
import hashlib#1 ######## md5 ######## # 目的:實現對b"HelloIt's me" 這句話進行md5加密 m = hashlib.md5() # 1)生成一個md5加密對象 m.update(b"Hello") # 2)使用m對 b"Hello" 加密 m.update(b"It's me") # 3) 使用m對 b"It's me"加密 print(m.hexdigest()) # 4) 最終加密結果就是對b"HelloIt's me"加密的md5值:5ddeb47b2f925ad0bf249c52e342728a#2 ######## sha1 ######## hash = hashlib.sha1() hash.update(b'admin') print(hash.hexdigest())#3 ######## sha256 ######## hash = hashlib.sha256() hash.update(b'admin') print(hash.hexdigest())#4 ######## sha384 ######## hash = hashlib.sha384() hash.update(b'admin') print(hash.hexdigest())#5 ######## sha512 ######## hash = hashlib.sha512() hash.update(b'admin') print(hash.hexdigest())以上加密算法雖然依然非常厲害,但時候存在缺陷,即:通過撞庫可以反解。所以,
有必要對加密算法中添加自定義key再來做加密
hmac添加自定義key加密
######### hmac ######## import hmac h = hmac.new(b"123456","真實要傳的內容".encode(encoding="utf-8")) print(h.digest()) print(h.hexdigest()) # 注:hmac是一種雙重加密方法,前面是加密的內容,后面才是真實要傳的數據信息subprocess模塊
subprocess原理以及常用的封裝函數
- 運行python的時候,我們都是在創建并運行一個進程。像Linux進程那樣,一個進程可以fork一個子進程,并讓這個子進程exec另外一個程序
- 在Python中,我們通過標準庫中的subprocess包來fork一個子進程,并運行一個外部的程序。
- subprocess包中定義有數個創建子進程的函數,這些函數分別以不同的方式創建子進程,所以我們可以根據需要來從中選取一個使用
- 另外subprocess還提供了一些管理標準流(standard stream)和管道(pipe)的工具,從而在進程間使用文本通信。
subprocess常用函數
#1、返回執行狀態:0 執行成功 retcode = subprocess.call(['ping', 'www.baidu.com', '-c5'])#2、返回執行狀態:0 執行成功,否則拋異常 subprocess.check_call(["ls", "-l"])#3、執行結果為元組:第1個元素是執行狀態,第2個是命令結果 >>> ret = subprocess.getstatusoutput('pwd') >>> ret (0, '/test01')#4、返回結果為 字符串 類型 >>> ret = subprocess.getoutput('ls -a') >>> ret '.\n..\ntest.py'#5、返回結果為'bytes'類型 >>> res=subprocess.check_output(['ls','-l']) >>> res.decode('utf8') '總用量 4\n-rwxrwxrwx. 1 root root 334 11月 21 09:02 test.py\n'將dos格式文件轉換成unix格式
subprocess.check_output(['chmod', '+x', filepath]) subprocess.check_output(['dos2unix', filepath])subprocess.Popen()
paramiko模塊
在windows中安裝paramiko
pip3 install paramikolinux中scp命令的使用
- ssh root@10.1.0.51 #ssh遠程登錄
- scp -rp aa.txt root@10.1.0.50:/tmp/ #將本地aa.txt文件復制到10.1.0.50的/tmp文件夾中
Paramiko模塊作用
- 如果需要使用SSH從一個平臺連接到另外一個平臺,進行一系列的操作時
比如:批量執行命令,批量上傳文件等操作,paramiko是最佳工具之一 - paramiko是用python語言寫的一個模塊,遵循SSH2協議,支持以加密和認證的方式,進行遠程服務器的連接
- 由于使用的是python這樣的能夠跨平臺運行的語言,所以所有python支持的平臺,如Linux, Solaris, BSD,MacOS X, Windows等,paramiko都可以支持
- 如果需要使用SSH從一個平臺連接到另外一個平臺,進行一系列的操作時,paramiko是最佳工具之一
- 現在如果需要從windows服務器上下載Linux服務器文件:
(1)使用paramiko可以很好的解決以上問題,它僅需要在本地上安裝相應的軟件(python以及PyCrypto)
(2) 對遠程服務器沒有配置要求,對于連接多臺服務器,進行復雜的連接操作特別有幫助
re模塊
re模塊常用的表達式符號
1 '.' 默認匹配除\n之外的任意一個字符,若指定flag DOTALL,則匹配任意字符,包括換行2 '^' 匹配字符開頭,若指定flags MULTILINE,這種也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)3 '$' 匹配字符結尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以4 '*' 匹配*號前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 結果為['abb', 'ab', 'a']5 '+' 匹配前一個字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 結果['ab', 'abb']6 '?' 匹配前一個字符1次或0次7 '{m}' 匹配前一個字符m次8 '{n,m}' 匹配前一個字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 結果'abb', 'ab', 'abb']9 '|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 結果'ABC' 10 '(...)' 分組匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 結果 abcabca456c 11 12 '\A' 只從字符開頭匹配,re.search("\Aabc","alexabc") 是匹配不到的 13 '\Z' 匹配字符結尾,同$ 14 '\d' 匹配數字0-9 15 '\D' 匹配非數字 16 '\w' 匹配[A-Za-z0-9] 17 '\W' 匹配非[A-Za-z0-9] 18 's' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 結果 '\t' 19 \b 匹配一個單詞邊界,也就是指單詞和空格間的位置,如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er” 20 \B 匹配非單詞邊界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”re模塊常用函數
re.compile(pattern[, flags])
- 1)把一個正則表達式pattern編譯成正則對象,以便可以用正則對象的match和search方法
- 2)用了re.compile以后,正則對象會得到保留,這樣在需要多次運用這個正則對象的時候,效率會有較大的提升
re.complie的使用
import re mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$') ret = re.match(mobile_re,'18538762511') print(ret) # <_sre.SRE_Match object; span=(0, 11), match='18538652511'>search(pattern, string[, flags]) 和 match(pattern, string[, flags])
- 1)match :只從字符串的開始與正則表達式匹配,匹配成功返回matchobject,否則返回none
- 2)search :將字符串的所有字串嘗試與正則表達式匹配,如果所有的字串都沒有匹配成功,返回none,否則返回matchobject
search 和match的比較
import re a =re.match('www.bai', 'www.baidu.com') b = re.match('bai', 'www.baidu.com') print(a.group()) # www.bai print(b) # None# 無論有多少個匹配的只會匹配一個 c = re.search('bai', 'www.baidubaidu.com') print(c) # <_sre.SRE_Match object; span=(4, 7), match='bai'> print(c.group()) # baisplit(pattern, string[, maxsplit=0])
作用:將字符串以指定分割方式,格式化成列表
split使用
findall(pattern, string)
作用:正則表達式 re.findall 方法能夠以列表的形式返回能匹配的子串
findall使用
import re p = re.compile(r'\d+') print(p.findall('one1two2three3four4')) # ['1', '2', '3', '4'] print(re.findall('o','one1two2three3four4')) # ['o', 'o', 'o'] print(re.findall('\w+', 'he.llo, wo#rld!')) # ['he', 'llo', 'wo', 'rld']sub(pat, repl, string[, count=0])
1)替換,將string里匹配pattern的部分,用repl替換掉,最多替換count次然后返回替換后的字符串
2)如果string里沒有可以匹配pattern的串,將被原封不動地返回
3)repl可以是一個字符串,也可以是一個函數
4) 如果repl是個字符串,則其中的反斜桿會被處理過,比如 \n 會被轉成換行符,反斜桿加數字會被替換成相應的組,比如 \6 表示pattern匹配到的第6個組的內容
sub使用
import re test="Hi, nice to meet you where are you from?" print(re.sub(r'\s','-',test)) # Hi,-nice-to-meet-you-where-are-you-from? print(re.sub(r'\s','-',test,5)) # Hi,-nice-to-meet-you-where are you from? print(re.sub('o','**',test)) # Hi, nice t** meet y**u where are y**u fr**m?escape(string)
1) re.escape(pattern) 可以對字符串中所有可能被解釋為正則運算符的字符進行轉義的應用函數。
2) 如果字符串很長且包含很多特殊技字符,而你又不想輸入一大堆反斜杠,或者字符串來自于用戶(比如通過raw_input函數獲取輸入的內容),
且要用作正則表達式的一部分的時候,可以用這個函數
escape使用
import re print(re.escape('www.python.org'))re模塊中的匹配對象和組 group()
1)group方法返回模式中與給定組匹配的字符串,如果沒有給定匹配組號,默認為組0
2)m.group() == m.group(0) == 所有匹配的字符
group()匹配之返回匹配索引
import re m = re.match('www\.(.*)\..*','www.baidu.com') print(m.group(1)) # baidu print(m.start(1)) # 4 print(m.end(1)) # 9 print(m.span(1)) # (4, 9)詳細鏈接參考這個
總結
以上是生活随笔為你收集整理的Python的常用模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: while和for循环读取大文件三种读取
- 下一篇: redis的五种数据类型及常见操作