目錄python
當項目愈來愈大,模塊文件裏功能愈來愈多,這時候把功能所有寫在一個模塊裏就不是很好維護了,因而就有了包的概念,將功能分不一樣的文件和放在不一樣的包中,每一個包裏面存在一個__init__
文件,用於導入本層包內全部模塊正則表達式
包是模塊一的一種形式,本質上就是一個含有.py的文件夾安全
導入包 發生了三件事情併發
# 導入包就至關於導入包內的__init__文件,執行的時候以執行文件路徑爲搜索路徑 # 對於用戶來講 導入包不能改變調用方式 import aaa aaa.m2() aaa.m3()
導入包內包的話 要在第一層包__init__
文件裏面導入第二層包的模塊和方法,這樣最外面執行文件能夠不用改變調用方式dom
# 絕對導入 from aaa.m1 import m1 from aaa.m2 import m2 from aaa.bbb import m3 from aaa.bbb import m4 # 相對導入 from .m1 import m1 from .m2 import m2 from .bbb import m3 from .bbb import m4 # .表明當前被導入文件所在的文件夾 # ..表明當前被導入文件所在的文件夾的上一級 # ...表明當前被導入文件所在的文件夾的上一級的上一級 # 相對導入 # 導入包內包的話 也要在第一層包__init__文件裏面導入第二層包的方法,這樣,最外面執行文件能夠不用改變調用方式導入 from ..bbb.m3 import m3 from ..bbb.m4 import m4
.
的左邊必須是一個包time模塊 主要提歐共了三種不一樣類型的時間,三種不一樣類型能夠相互轉換ssh
方法 | 描述 |
---|---|
time.time() | 時間戳形式 |
time.strftime('%Y-%m-%d %X') 最經常使用 | 格式化爲 2019-09-27 22:53:19 |
time.localtime() | 結構化時間 |
import time # 時間戳形式 print(time.time()) # 格式化時間 print(time.strftime('%Y-%m-%d %X')) # 結構化時間 print(time.localtime()) # 結構化時間 --》 格式化時間 struct_time = time.localtime(3600*24*365) print(time.strftime('%Y-%m-%d %X',struct_time)) # 格式化時間 --》 結構化時間 format_time = time.strftime('%Y-%m-%d %X') print(time.strptime(format_time,'%Y-%m-%d %X')) # 結構化時間 --》 時間戳 struct_time = time.localtime(3600*24*365) print(time.mktime(struct_time)) # 時間戳 --》 結構化時間 time_stamp = time.time() print(time.localtime(time_stamp))
datetime模塊:時間上能夠加減函數
import datetime now = datetime.datetime.now() print(now) # 2019-09-28 19:53:31.924508 # 默認3天 print(now + datetime.timedelta(3)) # 加3周 print(now + datetime.timedelta(weeks=3)) # 加3小時 print(now + datetime.timedelta(hours=3)) # 減3小時 print(now - datetime.timedelta(hours=3)) print(now + datetime.timedelta(hours=-3)) print(now.replace(year=1949, month=10, day=1, hour=10, minute=1, second=0, microsecond=0)) # 1949-10-01 10:01:00
random 主要用於生成隨機數工具
方法 | 描述 |
---|---|
random.random() | 生成 0-1 的隨機數 |
random.randint(1,10) | 生成指定序列的隨機數 |
random.randrange(1,3) | 生成指定序列的隨機數 |
random.shuffle([1,2,45,6,8]) | 隨機打亂順序 |
import random # 打印 0-1 的隨機數,並非真正的隨機 print(random.random()) # 0.6629366744271181 # 打印隨機數(1-10) print(random.randint(1,10)) # 6 # 大於等於1且小於3的整數 print(random.randrange(1,3)) # 1 # 大於1小於3的小數 print(random.uniform(1,3)) # 2.0132434909012336 # 隨機,打亂順序 lis = [1,4,5,7,] random.shuffle(lis) print(lis) print(random.choice(lis)) # 4
argparse
這個模塊能夠幫助咱們解析一些命令行傳過來的參數並作一些處理
就像這樣ui
python run.py --agt 6 --usr 1 --max_turn 40 --episodes 150 --movie_kb_path .\deep_dialog\data\movie_kb.1k.p --run_mode 2
this
def add_parser(parser): # 添加一些可選參數 parser.add_argument("-dog", dest="dog", default="輸入一隻狗的名字", type=str, help="輸入一隻狗的名字/命令") parser.add_argument("-u", "--ssh_user", dest="ssh_user", required=False, help="shh的用戶名, 好比: root") parser.add_argument("-tn", "--thread_num", dest="thread_num", required=False, help="併發線程數, 好比: 10") def init_base(): # 聲明一個參數解析對象 parser = argparse.ArgumentParser(prog="bible", description="統一自動化工具") subparser = parser.add_subparsers(title="統一自動化工具", description="可用功能", help="功能具體使用", dest="action") # 功能模板 template_parser = subparser.add_parser("template",help="功能") add_parser(template_parser) # #解析參數 args = parser.parse_args() init_base()
--dog - 表明一個可選參數 也能夠寫成一個- -dog
dest - 保存到ArgumentParser對象時的 參數名,
default - 默認值,若是不輸入參數默認顯示到終端的名字
type - 將輸入的字符串轉化成改數據類型
help - 輸入--help 時得到的幫助
required - 該命令行選項是否能夠省略(只針對可選參數)。
action - 在命令行遇到該參數時採起的基本動做類型。
[root@localhost]# python test.py -h usage: bible [-h] {template} ... 統一自動化工具 optional arguments: -h, --help show this help message and exit 統一自動化工具: 可用功能 {template} 功能具體使用 template 功能 [root@localhost]# python test.py template -h usage: bible template [-h] [-dog DOG] [-u SSH_USER] [-tn THREAD_NUM] optional arguments: -h, --help show this help message and exit -dog DOG 輸入一隻狗的名字/命令 -u SSH_USER, --ssh_user SSH_USER shh的用戶名, 好比: root -tn THREAD_NUM, --thread_num THREAD_NUM 併發線程數, 好比: 10
configparser 模塊主要用於 讀取配置文件內容
有以下配置文件
# test.cfg # 註釋1 ; 註釋2 [section1] k1 = v1 k2:v2 user=egon age=18 is_admin=true salary=31 [section2] k1 = v1
import configparser # 定義對象 並讀取cfg 配置文件 config = configparser.ConfigParser() config.read("test.cfg") # 查看全部的標題 res = config.sections() print(res) # ['section1', 'section2'] # 查看標題 下全部key opt = config.options("section1") print(opt) # ['k1', 'k2', 'user', 'age', 'is_admin', 'salary'] # 查看標題 下全部key的值 items_list = config.items("section1") print(items_list) # [('k1', 'v1'), ('k2', 'v2'), ('user', 'egon'), ('age', '18'), ('is_admin', 'true'), ('salary', '31')] # 查看標題下 指定key 的值 val = config.get("section1","user") print(val) # egon # 查看標題下 指定key 是數字的 的值 val_int = config.getint("section1","age") print(val_int) # 18 val = config.getint("section1","age") print(val) # 18
hashlib 模塊主要對字符串加密
hmac 模塊不只對字符加密,還加上了密鑰,更加安全
import hashlib import hmac # hashlib m = hashlib.md5() m.update(b"qinyj123") res = m.hexdigest() print(res) # a18973e94364927b08e7509dd3dbfde2 對於不一樣的字符而言,用不重複的密碼 # hmac m = hmac.new(b"qin1yj123123") # 加了一層密碼 m.update(b"qinyj123") res = m.hexdigest() print(res) # df1a1fcfaa4ec033406fe608b08ba45a
typing 函數主要與函數一塊兒連用,控制函數參數的數據類型用的,提供了基礎數據類型以外的數據類型
lt = [1,2,3,4] print(type(lt) is list) # True from typing import Iterable,Generator def func(x:int, lt:Iterable) -> list: return lt res = func(10,lt) print(res) # [1, 2, 3, 4]
正則表達式,去字符串找符合某種特色的字符串
元字符 | 描述 |
---|---|
^ | 匹配規則:以什麼什麼開頭 |
$ | 匹配規則:以什麼什麼結尾 |
. | 匹配任意字符 |
\d | 匹配 數字的 |
\D | 匹配 非數字的 |
\w | 匹配 非空 |
\W | 匹配 空的 |
\s | 匹配 空 |
\S | 匹配 非空 |
+ | 匹配 + 號前面的一個字符至少匹配1個 |
? | 匹配 ? 號前面的一個字符至少匹配0-1個 |
* | 匹配 * 號前面的一個字符至少匹配0個 |
[] | 匹配 [] 內的字符 |
[^] | [^] 內的字符都不匹配 |
| | 匹配 規則xx 或 規則xx |
{n} | 匹配 輸入的n個字符,依次找出來幾個符合的字符好比手機號13位 |
{1,2} | 匹配 前面字符2個 |
貪婪模式 | 非貪婪模式 |
---|---|
.* 一直匹配,直到匹配完畢 | .*?進入非貪婪模式,匹配特定的 |
最經常使用的就是如下修飾符了
修飾符 | 描述 |
---|---|
re.l | 讓匹配部分大小寫 |
re.M | 多行匹配,影響 ^ 和 $ |
re.S | 使 . 匹配包括換行在內的全部字符 |
import re # bug,應該都會打印出來 # s = "dhjsfsnfsnk" # res = re.findall("",s) # print(res) # 如下所有是元字符 # 1. ^ 以什麼什麼開頭 s = "sndkjbsfkbs" print(re.findall("^sn",s)) # ['sn'] print(re.findall("^fkb",s)) # [] # 2. $ 以什麼什麼結尾 s = "sndkjbsfkbs" print(re.findall("bs$",s)) # ['bs'] print(re.findall("dmskdhs$",s)) # [] # 3. . 匹配任意字符 s = "abc紅abc" print(re.findall(".",s)) # ['a', 'b', 'c', '紅', 'a', 'b', 'c'] print(re.findall(".add",s)) # [] # 4. \d 匹配數字 s = "sndkjbsfkbs13275242sadbhajsv" print(re.findall("\d",s)) # ['1', '3', '2', '7', '5', '2', '4', '2'] # 5. \w 匹配非空即不打印空,包括數字字母下劃線 s = "abc" print(re.findall("\w",s)) # ['a', 'b', 'c'] s = "a b c,dsds" print(re.findall("\w",s)) # ['a', 'b', 'c'] # 6.\s 匹配空 s = "abc" print(re.findall("\s",s)) s = "a b c,dsds" print(re.findall("\s",s)) # [' ', ' '] # 7. \D 匹配非數字 s = "abc123" print(re.findall("\D",s)) # ['a', 'b', 'c'] # 8. \W 匹配空的 s = "a b c" print(re.findall("\W",s)) # [' ', ' '] # 9. \S 匹配非空的 s = "a b c" print(re.findall("\S",s)) # ['a', 'b', 'c'] # 10. + 匹配 + 號前面的那一個字符 加上其餘字符至少有一個就打印 s = "12345" print(re.findall("23+",s)) # ['23'] # 11. ? 前面的一個字符0-1 個便可 s = "dafxsehtrnt" print(re.findall("dat?",s)) # ['f', 'fl'] # 12. * 前面的一個字符至少0個 s = "dafxsehtrnt" print(re.findall("@*",s)) # ['', '', '', '', '', '', '', '', '', '', '', ''] # 13. [] 只匹配中括號內的 s = "dmksff" print(re.findall("[dmks]",s)) # ['d', 'm', 'k', 's'] # 14. [^] 中括號內的不匹配 s = "dfa" print(re.findall("[^a]",s)) # ['d', 'f'] # 15. | 或 s = "dsajbfasfbia" print(re.findall("dsa|bia",s)) # ['dsa', 'bia'] # 16. {2} 匹配前面的2個字符 s = "fsdsfs" print(re.findall("fs{1,2}",s)) # ['fs', 'fs'] # 貪婪模式 # .* s = "saaasaaas" # 找到最後 print(re.findall("s.*s",s)) # ['saaasaaas'] # 非貪婪模式 .*? s = "saaasaaas" # 找到第一個不找了 print(re.findall("s.*?s",s)) # ['saaas'] # 匹配郵箱 # s = '#@#@#@nickchen121@163.com$$$$////nick@qq.com$$#$#$[]]2287273393@162.com@$2423423lksdlfj#' s = "{|}{}|PP~#&(*$(^1342542daj@162.com/,/<>>]]}{}nicsh_snn@qq.comdsff1232//1213#$%^^asnjkgsa123@gmail.comdwanua" print(re.findall("\w+@\w+.com",s)) # ['1342542daj@162.com', 'nicsh_snn@qq.com', 'asnjkgsa123@gmail.com'] # compile s = '3728427482097jkcbdscvdb}:{}:{' email_pattern = re.compile("\w+@\w+.com") phone_pattern = re.compile("\d{13}") print(re.findall(phone_pattern,s)) # ['3728427482097'] # match 從開頭找一個,找到不找了報錯 # s = 'ab abcddd abc' # res = re.match('ab*', s) # print(res.group()) # search 從字符串找一個就不找了 s = 'ab abcddd abc' res = re.search("abcd*",s) print(res.group()) # split 不匹配數字,以數字爲分隔符 s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj' print(re.split("\d+",s)) # ['ab', 'abcddd', 'abcasdfjlasjdk', 'l', 'lk', 'j', 'kl', 'kl', 'k', 'j', 'kl', 'j', 'lkj'] # sub == replace s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj' print(re.sub("\d+","",s)) # ababcdddabcasdfjlasjdkllkjklklkjkljlkj # subn 替換了多少次 s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj' print(re.subn("\d+","",s)) # ('ababcdddabcasdfjlasjdkllkjklklkjkljlkj', 12) # 修飾符 re.S 會讓.匹配換行符 s = '''abc abcabc*abc ''' print(re.findall("abc.abc",s)) # ['abc*abc'] print(re.findall("abc.abc",s,re.S)) # ['abc\nabc', 'abc*abc'] # 無名分組 只要括號裏的 s = 'abc abcd abcdd' print(re.findall("a(.)c(d)",s)) # [('b', 'd'), ('b', 'd')] # 有名分組 s = 'abc abcd abcdd' print(re.search("a(?P<name1>.)c(?P<name2>d)",s).groupdict()) # {'name1': 'b', 'name2': 'd'} # 超高級用法 s = 'abc123abc123' print(re.sub("c(\d+)a"," ",s)) # ab bc123 print(re.sub("c(?P<name1>\d+)a"," \g<name1> " ,s)) # ab 123 bc123