久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Python常用模塊大全(總結(jié))

 宇哥工作室 2020-09-04

時(shí)間模塊time() 與 datetime()

time()模塊中的重要函數(shù)

Python常用模塊大全(總結(jié))

time()模塊時(shí)間格式轉(zhuǎn)換

Python常用模塊大全(總結(jié))

time()模塊時(shí)間轉(zhuǎn)換

1.時(shí)間戳 1970年1月1日之后的秒, 即:time.time()

2.格式化的字符串 2014-11-11 11:11,, 即:time.strftime(’%Y-%m-%d’)

3.結(jié)構(gòu)化時(shí)間 元組包含了:年,、日,、星期等… time.struct_time 即:time.localtime()

import time
print(time.time()) # 時(shí)間戳:1511166937.2178104
print(time.strftime('%Y-%m-%d')) # 格式化的字符串: 2017-11-20
print(time.localtime()) # 結(jié)構(gòu)化時(shí)間(元組): (tm_year=2017, tm_mon=11...)
print(time.gmtime()) # 將時(shí)間轉(zhuǎn)換成utc格式的元組格式: (tm_year=2017, tm_mon=11...)

#1. 將結(jié)構(gòu)化時(shí)間轉(zhuǎn)換成時(shí)間戳: 1511167004.0
print(time.mktime(time.localtime()))

#2. 將格字符串時(shí)間轉(zhuǎn)換成結(jié)構(gòu)化時(shí)間 元組: (tm_year=2017, tm_mon=11...)
print(time.strptime('2014-11-11', '%Y-%m-%d'))

#3. 結(jié)構(gòu)化時(shí)間(元組) 轉(zhuǎn)換成 字符串時(shí)間 :2017-11-20
print(time.strftime('%Y-%m-%d', time.localtime())) # 默認(rèn)當(dāng)前時(shí)間

#4. 將結(jié)構(gòu)化時(shí)間(元組) 轉(zhuǎn)換成英文字符串時(shí)間 : Mon Nov 20 16:51:28 2017
print(time.asctime(time.localtime()))

#5. 將時(shí)間戳轉(zhuǎn)成 英文字符串時(shí)間 : Mon Nov 20 16:51:28 2017
print(time.ctime(time.time()))
  • ctime和asctime區(qū)別
    1)ctime傳入的是以秒計(jì)時(shí)的時(shí)間戳轉(zhuǎn)換成格式化時(shí)間
    2)asctime傳入的是時(shí)間元組轉(zhuǎn)換成格式化時(shí)間
  • import time
    t1 = time.time()
    print(t1) #1483495728.4734166
    print(time.ctime(t1)) #Wed Jan 4 10:08:48 2017
    t2 = time.localtime()
    print(t2) #time.struct_time(tm_year=2017, tm_mon=1, tm_mday=4, tm_hour=10, print(time.asctime(t2)) #Wed Jan 4 10:08:48 2017

    datetime獲取時(shí)間

    import datetime
    #1、datetime.datetime獲取當(dāng)前時(shí)間
    print(datetime.datetime.now())
    #2,、獲取三天后的時(shí)間
    print(datetime.datetime.now()+datetime.timedelta(+3))
    #3、獲取三天前的時(shí)間
    print(datetime.datetime.now()+datetime.timedelta(-3))
    #4,、獲取三個(gè)小時(shí)后的時(shí)間
    print(datetime.datetime.now()+datetime.timedelta(hours=3))
    #5、獲取三分鐘以前的時(shí)間
    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-52

    datetime時(shí)間轉(zhuǎn)換

    #1,、datetime對(duì)象與str轉(zhuǎn)化
    # datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    '2018-03-09 10:08:50'

    # datetime.datetime.strptime('2016-02-22',"%Y-%m-%d")
    datetime.datetime(2016, 2, 22, 0, 0)

    #2,、datetime對(duì)象轉(zhuǎn)時(shí)間元組
    # datetime.datetime.now().timetuple()
    time.struct_time(tm_year=2018, tm_mon=3, tm_mday=9,

    #3,、時(shí)間戳轉(zhuǎn)換成datetime對(duì)象
    # datetime.datetime.fromtimestamp(1520561646.8906238)
    datetime.datetime(2018, 3, 9, 10, 14, 6, 890624)

    本地時(shí)間與utc時(shí)間相互轉(zhuǎn)換

    # 本地時(shí)間與utc時(shí)間相互轉(zhuǎn)換
    import time
    import datetime

    def utc2local(utc_st):
    ''' 作用:將UTC時(shí)間裝換成本地時(shí)間
    :param utc_st: 傳入的是utc時(shí)間(datatime對(duì)象)
    :return: 返回的是本地時(shí)間 datetime 對(duì)象
    '''
    now_stamp = time.time()
    local_time = datetime.datetime.fromtimestamp(now_stamp)
    utc_time = datetime.datetime.utcfromtimestamp(now_stamp)
    offset = local_time - utc_time
    local_st = utc_st + offset
    return local_st

    def local2utc(local_st):
    ''' 作用:將本地時(shí)間轉(zhuǎn)換成UTC時(shí)間
    :param local_st: 傳入的是本地時(shí)間(datatime對(duì)象)
    :return: 返回的是utc時(shí)間 datetime 對(duì)象
    '''
    time_struct = time.mktime(local_st.timetuple())
    utc_st = datetime.datetime.utcfromtimestamp(time_struct)
    return utc_st

    utc_time = datetime.datetime.utcfromtimestamp(time.time())
    # utc_time = datetime.datetime(2018, 5, 6, 5, 57, 9, 511870) # 比北京時(shí)間晚了8個(gè)小時(shí)
    local_time = datetime.datetime.now()
    # local_time = datetime.datetime(2018, 5, 6, 13, 59, 27, 120771) # 北京本地時(shí)間

    utc_to_local = utc2local(utc_time)
    local_to_utc = local2utc(local_time)
    print utc_to_local # 2018-05-06 14:02:30.650270 已經(jīng)轉(zhuǎn)換成了北京本地時(shí)間
    print local_to_utc # 2018-05-06 06:02:30 轉(zhuǎn)換成北京當(dāng)?shù)貢r(shí)間

    django的timezone時(shí)間與本地時(shí)間轉(zhuǎn)換

    # django的timezone時(shí)間與本地時(shí)間轉(zhuǎn)換
    from django.utils import timezone
    from datetime import datetime

    utc_time = timezone.now()
    local_time = datetime.now()

    #1,、utc時(shí)間裝換成本地時(shí)間
    utc_to_local = timezone.localtime(timezone.now())

    #2,、本地時(shí)間裝utc時(shí)間
    local_to_utc = timezone.make_aware(datetime.now(), timezone.get_current_timezone())

    Python計(jì)算兩個(gè)日期之間天數(shù)

    import datetime
    d1 = datetime.datetime(2018,10,31) # 第一個(gè)日期
    d2 = datetime.datetime(2019,2,2) # 第二個(gè)日期
    interval = d2 - d1 # 兩日期差距
    print(interval.days) # 具體的天數(shù)

    random()模塊

    random()模塊常用函數(shù)

    Python常用模塊大全(總結(jié))

    random常用函數(shù)舉例

    import random
    #⒈ 隨機(jī)整數(shù):
    print(random.randint(0,99)) # 隨機(jī)選取0-99之間的整數(shù)
    print(random.randrange(0, 101, 2)) # 隨機(jī)選取0-101之間的偶數(shù)

    #⒉ 隨機(jī)浮點(diǎn)數(shù):
    print(random.random()) # 0.972654134347
    print(random.uniform(1, 10)) # 4.14709813772

    #⒊ 隨機(jī)字符:
    print(random.choice('abcdefg')) # c
    print(random.sample('abcdefghij',3)) # ['j', 'f', 'c']

    使用random實(shí)現(xiàn)四位驗(yàn)證碼

    1. 使用for循環(huán)實(shí)現(xiàn)
    # 使用for循環(huán)實(shí)現(xiàn)
    import random
    checkcode = ''
    for i in range(4):
    current = random.randrange(0,4)
    if current == i:
    tmp = chr(random.randint(65,90)) #65,90表示所有大寫(xiě)字母
    else:
    tmp = random.randint(0,9)
    checkcode += str(tmp)
    print(checkcode) #運(yùn)行結(jié)果: 851K

    2.使用random.sample實(shí)現(xiàn)

    import random
    import string
    str_source = string.ascii_letters + string.digits
    str_list = random.sample(str_source,7)

    #['i', 'Q', 'U', 'u', 'A', '0', '9']
    print(str_list)
    str_final = ''.join(str_list)

    #iQUuA09
    print(str_final) # 運(yùn)行結(jié)果: jkFU2Ed

    os模塊

    • os模塊常用方法
    import os
    #1 當(dāng)前工作目錄,,即當(dāng)前python腳本工作的目錄路徑
    print(os.getcwd()) # C:\Users\admin\PycharmProjects\s14\Day5\test4

    #2 當(dāng)前腳本工作目錄;相當(dāng)于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 返回當(dāng)前目錄: ('.')
    print(os.curdir) # ('.')

    #4 獲取當(dāng)前目錄的父目錄字符串名:('..')
    print(os.pardir) # ('..')

    #5 可生成多層遞歸目錄
    os.makedirs(r'C:\aaa\bbb') # 可以發(fā)現(xiàn)在C盤(pán)創(chuàng)建了文件夾/aaa/bbb

    #6 若目錄為空,,則刪除,并遞歸到上一級(jí)目錄,,如若也為空,則刪除,,依此類(lèi)推
    os.removedirs(r'C:\aaa\bbb') # 刪除所有空目錄

    #7 生成單級(jí)目錄,;相當(dāng)于shell中mkdir dirname
    os.mkdir(r'C:\bbb') # 僅能創(chuàng)建單個(gè)目錄

    #8 刪除單級(jí)空目錄,若目錄不為空則無(wú)法刪除,,報(bào)錯(cuò),;相當(dāng)于shell中rmdir dirname
    os.rmdir(r'C:\aaa') # 僅刪除指定的一個(gè)空目錄

    #9 列出指定目錄下的所有文件和子目錄,,包括隱藏文件,,并以列表方式打印
    print(os.listdir(r"C:\Users\admin\PycharmProjects\s14"))

    #10 刪除一個(gè)文件
    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 輸出操作系統(tǒng)特定的路徑分隔符,win下為"\\",Linux下為"/"
    print(os.sep) # \

    #14 輸出當(dāng)前平臺(tái)使用的行終止符,,win下為"\r\n",Linux下為"\n"
    print(os.linesep)

    #15 輸出用于分割文件路徑的字符串
    print(os.pathsep) # ; (分號(hào))

    #16 輸出字符串指示當(dāng)前使用平臺(tái),。win->'nt'; Linux->'posix'
    print(os.name) # nt

    #17 運(yùn)行shell命令,直接顯示
    os.system("bash command")

    #18 獲取系統(tǒng)環(huán)境變量
    print(os.environ) # environ({'OS': 'Windows_NT', 'PUBLIC': ………….

    #19 返回path規(guī)范化的絕對(duì)路徑
    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的目錄。其實(shí)就是os.path.split(path)的第一個(gè)元素
    print(os.path.dirname(r'C:/bbb/ccc')) # C:/bbb

    #22 返回path最后的文件名,。如何path以/或\結(jié)尾,,那么就會(huì)返回空值。即os.path.split(path)的第二個(gè)元素
    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是絕對(duì)路徑,,返回True # True
    print(os.path.isabs(r"C:\Users\admin\PycharmProjects\s14\Day5\test4"))

    #25 如果path是一個(gè)存在的文件,,返回True。否則返回False
    print(os.path.isfile(r'C:/bbb/ccc/test2.txt')) # True

    #26 如果path是一個(gè)存在的目錄,,則返回True,。否則返回False
    print(os.path.isdir(r'C:/bbb/ccc')) # True

    #28 返回path所指向的文件或者目錄的最后存取時(shí)間
    print(os.path.getatime(r'C:/bbb/ccc/test2.txt')) # 1483509254.9647143

    #29 返回path所指向的文件或者目錄的最后修改時(shí)間
    print(os.path.getmtime(r'C:/bbb/ccc/test2.txt')) # 1483510068.746478

    #30 無(wú)論linux還是windows,拼接出文件路徑
    put_filename = '%s%s%s'%(self.home,os. path.sep, filename)
    #C:\Users\admin\PycharmProjects\s14\day10select版FTP\home
  • os命令創(chuàng)建文件夾: C:/aaa/bbb/ccc/ddd并寫(xiě)入文件file1.txt
  • import os

    os.makedirs('C:/aaa/bbb/ccc/ddd',exist_ok=True) # exist_ok=True:如果存在當(dāng)前文件夾不報(bào)錯(cuò)
    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!!')
  • 將其他目錄的絕對(duì)路徑動(dòng)態(tài)的添加到pyhton的環(huán)境變量中
  • import os,sys
    print(os.path.dirname( os.path.dirname( os.path.abspath(__file__) ) ))
    BASE_DIR = os.path.dirname( os.path.dirname( os.path.abspath(__file__) ) )
    sys.path.append(BASE_DIR)

    # 代碼解釋?zhuān)?br># 要想導(dǎo)入其他目錄中的函數(shù),,其實(shí)就是將其他目錄的絕對(duì)路徑動(dòng)態(tài)的添加到pyhton的環(huán)境變量中,,這樣python解釋器就能夠在運(yùn)行時(shí)找到導(dǎo)入的模塊而不報(bào)錯(cuò):
    # 然后調(diào)用sys模塊sys.path.append(BASE_DIR)就可以將這條路徑添加到python環(huán)境變量中
  • os.popen獲取腳本執(zhí)行結(jié)果
    1.data.py
  • data = {'name':'aaa'}
    import json
    print json.dumps(data)

    2.get_data.py

    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
    import os,json

    ret = os.popen('python data.py')
    data = ret.read().strip()
    ret.close()
    data = json.loads(data)
    print data # {'name':'aaa'}

    sys模塊

    1、 sys基本方法

    sys.argv     返回執(zhí)行腳本傳入的參數(shù)

    sys.exit(n)      退出程序,,正常退出時(shí)exit(0)

    sys.version    獲取Python解釋程序的版本信息

    sys.maxint    最大的Int值

    sys.path    返回模塊的搜索路徑,,初始化時(shí)使用PYTHONPATH環(huán)境變量的值

    sys.platform    返回操作系統(tǒng)平臺(tái)名稱(chēng)

    sys.stdout.write(‘please:’)

    val = sys.stdin.readline()[:-1]

    2、使用sys返回運(yùn)行腳本參數(shù)

    import sys
    # C:\Users\tom\PycharmProjects\s14Review\day01> python test01.py 1 2 3
    print(sys.argv) # 打印所有參數(shù) ['test01.py', '1', '2', '3']
    print(sys.argv[1:]) # 獲取索引 1 往后的所有參數(shù) ['1', '2', '3']

    tarfile用于將文件夾歸檔成 .tar的文件

    • tarfile使用
    import tarfile
    # 將文件夾Day1和Day2歸檔成your.rar并且在歸檔文件夾中Day1和Day2分別變成bbs2.zip和ccdb.zip的壓縮文件
    tar = tarfile.open('your.tar','w')
    tar.add(r'C:\Users\admin\PycharmProjects\s14\Day1', arcname='bbs2.zip')
    tar.add(r'C:\Users\admin\PycharmProjects\s14\Day2', arcname='cmdb.zip')
    tar.close()

    # 將剛剛的歸檔文件your.tar進(jìn)行解壓解壓的內(nèi)容是bbs2.zip和cmdb.zip壓縮文件而不是變成原有的文件夾
    tar = tarfile.open('your.tar','r')
    tar.extractall() # 可設(shè)置解壓地址
    tar.close()

    shutil 創(chuàng)建壓縮包,復(fù)制,移動(dòng)文件

    ? : shutil 對(duì)壓縮包的處理是調(diào)用 ZipFile 和 TarFile 兩個(gè)模塊來(lái)進(jìn)行的  作用: shutil 創(chuàng)建壓縮包并返回文件路徑(如:zip,、tar),,并且可以復(fù)制文件,移動(dòng)文件 

    shutil使用

    import shutil
    #1 copyfileobj() 將文件test11.txt中的內(nèi)容復(fù)制到test22.txt文件中
    f1 = open("test11.txt",encoding="utf-8")
    f2 = open("test22.txt",'w',encoding="utf-8")
    shutil.copyfileobj(f1,f2)

    #2 copyfile() 直接指定文件名就可進(jìn)行復(fù)制
    shutil.copyfile("test11.txt",'test33.txt')

    #3 shutil.copymode(src, dst) 僅拷貝權(quán)限,。內(nèi)容,、組、用戶(hù)均不變

    #4 shutil.copystat(src, dst) 拷貝狀態(tài)的信息,,包括:mode bits, atime, mtime, flags
    shutil.copystat('test11.txt','test44.txt')

    #5 遞歸的去拷貝目錄中的所有目錄和文件,這里的test_dir是一個(gè)文件夾,,包含多級(jí)文件夾和文件
    shutil.copytree("test_dir","new_test_dir")

    #6 遞歸的去刪除目錄中的所有目錄和文件,這里的test_dir是一個(gè)文件夾,包含多級(jí)文件夾和文件
    shutil.rmtree("test_dir")

    #7 shutil.move(src, dst) 遞歸的去移動(dòng)文件
    shutil.move('os_test.py',r'C:\\')

    #8 shutil.make_archive(base_name, format,...) 創(chuàng)建壓縮包并返回文件路徑,,例如:zip,、tar
    '''
    1. base_name: 壓縮包的文件名,也可以是壓縮包的路徑,。只是文件名時(shí),,則保存至當(dāng)前目錄,否則保存至指定路徑,,
    如:www =>保存至當(dāng)前路徑
    如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/
    2. format: 壓縮包種類(lèi),,“zip”, “tar”, “bztar”,“gztar”
    3. root_dir: 要壓縮的文件夾路徑(默認(rèn)當(dāng)前目錄)
    4. owner: 用戶(hù),,默認(rèn)當(dāng)前用戶(hù)
    5. group: 組,,默認(rèn)當(dāng)前組
    6. logger: 用于記錄日志,,通常是logging.Logger對(duì)象

    '''
    #將C:\Users\admin\PycharmProjects\s14\Day4 的文件夾壓縮成 testaa.zip
    shutil.make_archive("testaa","zip",r"C:\Users\admin\PycharmProjects\s14\Day4")

    zipfile將文件或文件夾進(jìn)行壓縮

    • zipfile使用
    import zipfile
    #將文件main.py和test11.py壓縮成day5.zip的壓縮文件
    z = zipfile.ZipFile('day5.zip', 'w')
    z.write('main.py')
    z.write("test11.txt")
    z.close()

    #將剛剛壓縮的day5.zip文件進(jìn)行解壓成原文件
    z = zipfile.ZipFile('day5.zip', 'r')
    z.extractall()
    z.close()

    shelve 模塊

    作用:shelve模塊是一個(gè)簡(jiǎn)單的k,v將內(nèi)存數(shù)據(jù)通過(guò)文件持久化的模塊,可以持久化任何pickle可支持的python數(shù)據(jù)格式

    shelve持久化

    import shelve
    import datetime
    #1 首先使用shelve將.py中定義的字典列表等讀取到指定文件shelve_test中,,其實(shí)我們可不必關(guān)心在文件中是怎樣存儲(chǔ)的
    d = shelve.open('shelve_test') #打開(kāi)一個(gè)文件
    info = {"age":22,"job":"it"}
    name = ["alex","rain","test"]
    d["name"] = name #持久化列表
    d["info"] = info
    d["date"] = datetime.datetime.now()
    d.close()

    #2 在這里我們可以將剛剛讀取到 shelve_test文件中的內(nèi)容從新獲取出來(lái)
    d = shelve.open('shelve_test') # 打開(kāi)一個(gè)文件
    print(d.get("name")) # ['alex', 'rain', 'test']
    print(d.get("info")) # {'job': 'it', 'age': 22}
    print(d.get("date")) # 2017-11-20 17:54:21.223410

    json和pickle序列化

    1,、json序列化

    1. 序列化 (json.dumps) :是將內(nèi)存中的對(duì)象存儲(chǔ)到硬盤(pán),變成字符串

    2. 反序列化(json.loads) : 將剛剛保存在硬盤(pán)中的內(nèi)存對(duì)象從新加載到內(nèi)存中

    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"])

    2,、pickle序列化

    1. python的pickle模塊實(shí)現(xiàn)了python的所有數(shù)據(jù)序列和反序列化,。基本上功能使用和JSON模塊沒(méi)有太大區(qū)別,,方法也同樣是dumps/dump和loads/load

    2. 與JSON不同的是pickle不是用于多種語(yǔ)言間的數(shù)據(jù)傳輸,,它僅作為python對(duì)象的持久化或者python程序間進(jìn)行互相傳輸對(duì)象的方法,因此它支持了python所有的數(shù)據(jù)類(lèi)型,。

    pickle序列化

    #pickle序列化代碼
    import pickle
    info = {
    'name':"tom",
    "age" :"100"
    }
    f = open("test.txt",'wb')
    f.write(pickle.dumps(info))
    f.close()

    pickle反序列化

    #pickle反序列化代碼
    import pickle
    f = open("test.txt","rb")
    data = pickle.loads(f.read())
    f.close()
    print(data["age"])

    3,、解決JSON不可以序列化datetime類(lèi)型

    解決json無(wú)法序列化時(shí)間格式

    import json,datetime

    class 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') #指定將內(nèi)容寫(xiě)入到ttt文件中
    f.write(json.dumps(t,cls=JsonCustomEncoder)) #使用時(shí)候只要在json.dumps增加個(gè)cls參數(shù)即可

    4、JSON和pickle模塊的區(qū)別

    1. JSON只能處理基本數(shù)據(jù)類(lèi)型,。pickle能處理所有Python的數(shù)據(jù)類(lèi)型,。

    2. JSON用于各種語(yǔ)言之間的字符轉(zhuǎn)換。pickle用于Python程序?qū)ο蟮某志没蛘逷ython程序間對(duì)象網(wǎng)絡(luò)傳輸,,但不同版本的Python序列化可能還有差異

    hashlib 模塊

    1,、用于加密相關(guān)的操作,代替了md5模塊和sha模塊,,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,,MD5 算法

    五種簡(jiǎn)單加密方式

    import hashlib

    #1 ######## md5 ########
    # 目的:實(shí)現(xiàn)對(duì)b"HelloIt's me" 這句話(huà)進(jìn)行md5加密
    m = hashlib.md5() # 1)生成一個(gè)md5加密對(duì)象
    m.update(b"Hello") # 2)使用m對(duì) b"Hello" 加密
    m.update(b"It's me") # 3) 使用m對(duì) b"It's me"加密
    print(m.hexdigest()) # 4) 最終加密結(jié)果就是對(duì)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())

    2、以上加密算法雖然依然非常厲害,,但時(shí)候存在缺陷,,即:通過(guò)撞庫(kù)可以反解。所以,,有必要對(duì)加密算法中添加自定義key再來(lái)做加密,。

    hmac添加自定義key加密

    ######### hmac ########
    import hmac
    h = hmac.new(b"123456","真實(shí)要傳的內(nèi)容".encode(encoding="utf-8"))
    print(h.digest())
    print(h.hexdigest())
    # 注:hmac是一種雙重加密方法,前面是加密的內(nèi)容,,后面才是真實(shí)要傳的數(shù)據(jù)信息

    subprocess 模塊

    1、subprocess原理以及常用的封裝函數(shù)

    1. 運(yùn)行python的時(shí)候,,我們都是在創(chuàng)建并運(yùn)行一個(gè)進(jìn)程,。像Linux進(jìn)程那樣,一個(gè)進(jìn)程可以fork一個(gè)子進(jìn)程,,并讓這個(gè)子進(jìn)程exec另外一個(gè)程序

    2. 在Python中,,我們通過(guò)標(biāo)準(zhǔn)庫(kù)中的subprocess包來(lái)fork一個(gè)子進(jìn)程,并運(yùn)行一個(gè)外部的程序,。

    3. subprocess包中定義有數(shù)個(gè)創(chuàng)建子進(jìn)程的函數(shù),,這些函數(shù)分別以不同的方式創(chuàng)建子進(jìn)程,所以我們可以根據(jù)需要來(lái)從中選取一個(gè)使用

    4. 另外subprocess還提供了一些管理標(biāo)準(zhǔn)流(standard stream)和管道(pipe)的工具,從而在進(jìn)程間使用文本通信,。

    subprocess常用函數(shù)

    #1,、返回執(zhí)行狀態(tài):0 執(zhí)行成功
    retcode = subprocess.call(['ping', 'www.baidu.com', '-c5'])

    #2、返回執(zhí)行狀態(tài):0 執(zhí)行成功,,否則拋異常
    subprocess.check_call(["ls", "-l"])

    #3,、執(zhí)行結(jié)果為元組:第1個(gè)元素是執(zhí)行狀態(tài),第2個(gè)是命令結(jié)果
    >>> ret = subprocess.getstatusoutput('pwd')
    >>> ret
    (0, '/test01')

    #4,、返回結(jié)果為 字符串 類(lèi)型
    >>> ret = subprocess.getoutput('ls -a')
    >>> ret
    '.\n..\ntest.py'


    #5,、返回結(jié)果為'bytes'類(lèi)型
    >>> res=subprocess.check_output(['ls','-l'])
    >>> res.decode('utf8')
    '總用量 4\n-rwxrwxrwx. 1 root root 334 11月 21 09:02 test.py\n'

    將dos格式文件轉(zhuǎn)換成unix格式

    subprocess.check_output(['chmod', '+x', filepath])
    subprocess.check_output(['dos2unix', filepath])

    2、subprocess.Popen()

    1. 實(shí)際上,,上面的幾個(gè)函數(shù)都是基于Popen()的封裝(wrapper),,這些封裝的目的在于讓我們?nèi)菀资褂米舆M(jìn)程

    2. 當(dāng)我們想要更個(gè)性化我們的需求的時(shí)候,就要轉(zhuǎn)向Popen類(lèi),,該類(lèi)生成的對(duì)象用來(lái)代表子進(jìn)程

    3. 與上面的封裝不同,,Popen對(duì)象創(chuàng)建后,主程序不會(huì)自動(dòng)等待子進(jìn)程完成,。我們必須調(diào)用對(duì)象的wait()方法,,父進(jìn)程才會(huì)等待 (也就是阻塞block)

    4. 從運(yùn)行結(jié)果中看到,父進(jìn)程在開(kāi)啟子進(jìn)程之后并沒(méi)有等待child的完成,,而是直接運(yùn)行print,。

    chil

    #1、先打印'parent process'不等待child的完成
    import subprocess
    child = subprocess.Popen(['ping','-c','4','www.baidu.com'])
    print('parent process')

    #2,、后打印'parent process'等待child的完成
    import subprocess
    child = subprocess.Popen('ping -c4 www.baidu.com',shell=True)
    child.wait()
    print('parent process')

    child.poll() # 檢查子進(jìn)程狀態(tài)

        child.kill() # 終止子進(jìn)程

        child.send_signal() # 向子進(jìn)程發(fā)送信號(hào)

        child.terminate() # 終止子進(jìn)程

    3,、subprocess.PIPE 將多個(gè)子進(jìn)程的輸入和輸出連接在一起

    1. subprocess.PIPE實(shí)際上為文本流提供一個(gè)緩存區(qū)。child1的stdout將文本輸出到緩存區(qū),,隨后child2的stdin從該P(yáng)IPE中將文本讀取走

    2. child2的輸出文本也被存放在PIPE中,,直到communicate()方法從PIPE中讀取出PIPE中的文本。

    3. 注意:communicate()是Popen對(duì)象的一個(gè)方法,,該方法會(huì)阻塞父進(jìn)程,,直到子進(jìn)程完成

    分步執(zhí)行cat /etc/passwd | grep root命

    import subprocess
    #下面執(zhí)行命令等價(jià)于: cat /etc/passwd | grep root
    child1 = subprocess.Popen(["cat","/etc/passwd"], stdout=subprocess.PIPE)
    child2 = subprocess.Popen(["grep","root"],stdin=child1.stdout, stdout=subprocess.PIPE)
    out = child2.communicate() #返回執(zhí)行結(jié)果是元組
    print(out)
    #執(zhí)行結(jié)果: (b'root:x:0:0:root:/root:/bin/bash\noperator:x:11:0:operator:/root:/sbin/nologin\n', None)

    獲取ping命令執(zhí)行結(jié)果

    import subprocess

    list_tmp = []
    def main():
    p = subprocess.Popen(['ping', 'www.baidu.com', '-c5'], stdin = subprocess.PIPE, stdout = subprocess.PIPE)
    while subprocess.Popen.poll(p) == None:
    r = p.stdout.readline().strip().decode('utf-8')
    if r:
    # print(r)
    v = p.stdout.read().strip().decode('utf-8')
    list_tmp.append(v)
    main()
    print(list_tmp[0])
    協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明,。

    re模塊

    1, 常用正則表達(dá)式符號(hào)

    ⒈通配符( . )

    作用:點(diǎn)(.)可以匹配除換行符以外的任意一個(gè)字符串

    例如:‘.ython’ 可以匹配‘a(chǎn)ython’ ‘bython’ 等等,,但只能匹配一個(gè)字符串

    ⒉轉(zhuǎn)義字符( \ )

    作用:可以將其他有特殊意義的字符串以原本意思表示

    例如:‘python.org’ 因?yàn)樽址杏幸粋€(gè)特殊意義的字符串(.)所以如果想將其按照普通意義就必須使用這樣表示: ‘python.org’ 這樣就只會(huì)匹配‘python.org’ 了

    注:如果想對(duì)反斜線(xiàn)(\)自身轉(zhuǎn)義可以使用雙反斜線(xiàn)(\)這樣就表示 ’\’

    ⒊字符集

    作用:使用中括號(hào)來(lái)括住字符串來(lái)創(chuàng)建字符集,字符集可匹配他包括的任意字串

    ①‘[pj]ython’ 只能夠匹配‘python’ ‘jython’

    ② ‘[a-z]’ 能夠(按字母順序)匹配a-z任意一個(gè)字符

    ③‘[a-zA-Z0-9]’ 能匹配任意一個(gè)大小寫(xiě)字母和數(shù)字

    ④‘[^abc]’ 可以匹配任意除a,b和c 之外的字符串

    ⒋管道符

    作用:一次性匹配多個(gè)字符串

    例如:’python|perl’ 可以匹配字符串‘python’ 和 ‘perl’

    ⒌可選項(xiàng)和重復(fù)子模式(在子模式后面加上問(wèn)號(hào),?)

    作用:在子模式后面加上問(wèn)號(hào),,他就變成可選項(xiàng),出現(xiàn)或者不出現(xiàn)在匹配字符串中都是合法的

    例如:r’(aa)?(bb)?ccddee’ 只能匹配下面幾種情況

    ‘a(chǎn)abbccddee’

    ‘a(chǎn)accddee’

    ‘bbccddee’

    ‘ccddee’

    ⒍字符串的開(kāi)始和結(jié)尾

    ① ‘w+’ 匹配以w開(kāi)通的字符串

    ② ‘^http’ 匹配以’http’ 開(kāi)頭的字符串

    ③‘ $com’ 匹配以‘com’結(jié)尾的字符串

    7.最常用的匹配方法

    \d 匹配任何十進(jìn)制數(shù),;它相當(dāng)于類(lèi) [0-9],。

           \D 匹配任何非數(shù)字字符,;它相當(dāng)于類(lèi) [^0-9]。

           \s 匹配任何空白字符,;它相當(dāng)于類(lèi) [ fv],。

           \S 匹配任何非空白字符;它相當(dāng)于類(lèi) [^ fv],。

           \w 匹配任何字母數(shù)字字符,;它相當(dāng)于類(lèi) [a-zA-Z0-9_]。

           \W 匹配任何非字母數(shù)字字符,;它相當(dāng)于類(lèi) [^a-zA-Z0-9_],。

    \w* 匹配所有字母字符

    \w+ 至少匹配一個(gè)字符

    re模塊更詳細(xì)表達(dá)式符號(hào)

    1 '.'         默認(rèn)匹配除\n之外的任意一個(gè)字符,若指定flag DOTALL,則匹配任意字符,,包括換行
    2 '^' 匹配字符開(kāi)頭,,若指定flags MULTILINE,這種也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
    3 '$' 匹配字符結(jié)尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
    4 '*' 匹配*號(hào)前的字符0次或多次,,re.findall("ab*","cabb3abcbbac") 結(jié)果為['abb', 'ab', 'a']
    5 '+' 匹配前一個(gè)字符1次或多次,,re.findall("ab+","ab+cd+abb+bba") 結(jié)果['ab', 'abb']
    6 '?' 匹配前一個(gè)字符1次或0次
    7 '{m}' 匹配前一個(gè)字符m次
    8 '{n,m}' 匹配前一個(gè)字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 結(jié)果'abb', 'ab', 'abb']
    9 '|' 匹配|左或|右的字符,,re.search("abc|ABC","ABCBabcCD").group() 結(jié)果'ABC'
    10 '(...)' 分組匹配,,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 結(jié)果 abcabca456c
    11
    12 '\A' 只從字符開(kāi)頭匹配,re.search("\Aabc","alexabc") 是匹配不到的
    13 '\Z' 匹配字符結(jié)尾,,同$
    14 '\d' 匹配數(shù)字0-9
    15 '\D' 匹配非數(shù)字
    16 '\w' 匹配[A-Za-z0-9]
    17 '\W' 匹配非[A-Za-z0-9]
    18 's' 匹配空白字符,、\t、\n,、\r , re.search("\s+","ab\tc1\n3").group() 結(jié)果 '\t'
    19 \b 匹配一個(gè)單詞邊界,,也就是指單詞和空格間的位置,如,,“er\b”可以匹配“never”中的“er”,,但不能匹配“verb”中的“er”
    20 \B 匹配非單詞邊界?!癳r\B”能匹配“verb”中的“er”,,但不能匹配“never”中的“er”

    re模塊常用函數(shù)*

    Python常用模塊大全(總結(jié))

    ⒈ re.compile(pattern[, flags])

    1)把一個(gè)正則表達(dá)式pattern編譯成正則對(duì)象,以便可以用正則對(duì)象的match和search方法

    2)用了re.compile以后,,正則對(duì)象會(huì)得到保留,,這樣在需要多次運(yùn)用這個(gè)正則對(duì)象的時(shí)候,效率會(huì)有較大的提升

    re.compile使用

    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 :只從字符串的開(kāi)始與正則表達(dá)式匹配,,匹配成功返回matchobject,否則返回none,;

    2)search :將字符串的所有字串嘗試與正則表達(dá)式匹配,,如果所有的字串都沒(méi)有匹配成功,,返回none,否則返回matchobject,;

    match與search使用比較

    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

    # 無(wú)論有多少個(gè)匹配的只會(huì)匹配一個(gè)
    c = re.search('bai', 'www.baidubaidu.com')
    print(c) # <_sre.SRE_Match object; span=(4, 7), match='bai'>
    print(c.group()) # bai

    ⒊ split(pattern, string[, maxsplit=0])

    作用:將字符串以指定分割方式,,格式化成列表

    import re
    text = 'aa 1bb###2cc3ddd'
    print(re.split('\W+', text)) # ['aa', '1bb', '2cc3ddd']
    print(re.split('\W', text)) # ['aa', '1bb', '', '', '2cc3ddd']
    print(re.split('\d', text)) # ['aa ', 'bb###', 'cc', 'ddd']
    print(re.split('#', text)) # ['aa 1bb', '', '', '2cc3ddd']
    print(re.split('#+', text)) # ['aa 1bb', '2cc3ddd']

    ⒋ findall(pattern, string)

    作用:正則表達(dá)式 re.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里沒(méi)有可以匹配pattern的串,將被原封不動(dòng)地返回

    3)repl可以是一個(gè)字符串,,也可以是一個(gè)函數(shù)

    4) 如果repl是個(gè)字符串,,則其中的反斜桿會(huì)被處理過(guò),比如 \n 會(huì)被轉(zhuǎn)成換行符,,反斜桿加數(shù)字會(huì)被替換成相應(yīng)的組,,比如 \6 表示pattern匹配到的第6個(gè)組的內(nèi)容

    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) 可以對(duì)字符串中所有可能被解釋為正則運(yùn)算符的字符進(jìn)行轉(zhuǎn)義的應(yīng)用函數(shù)。

    2) 如果字符串很長(zhǎng)且包含很多特殊技字符,,而你又不想輸入一大堆反斜杠,,或者字符串來(lái)自于用戶(hù)(比如通過(guò)raw_input函數(shù)獲取輸入的內(nèi)容),

    且要用作正則表達(dá)式的一部分的時(shí)候,,可以用這個(gè)函數(shù)

    import re
    print(re.escape('www.python.org'))

    3,、re模塊中的匹配對(duì)象和組 group()

    1)group方法返回模式中與給定組匹配的字符串,如果沒(méi)有給定匹配組號(hào),,默認(rèn)為組0

    2)m.group() == m.group(0) == 所有匹配的字符

    group(0)與group(1)區(qū)別比較

    import re
    a = "123abc321efg456"
    print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)) # 123abc321
    print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).groups()) # ('123', 'abc', '321')
    print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)) # 123
    print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)) # abc
    print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)) # 321


    import re
    m = re.match('(..).*(..)(..)','123456789')
    print(m.group(0)) # 123456789
    print(m.group(1)) # 12
    print(m.group(2)) # 67
    print(m.group(3)) # 89

    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)

    group()匹配ip,狀態(tài)以元組返回

    import re
    test = 'dsfdf 22 g2323 GigabitEthernet0/3 10.1.8.1 YES NVRAM up eee'
    # print(re.match('(\w.*\d)\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+YES\s+NVRAM\s+(\w+)\s+(\w+)\s*', test).groups())

    ret = re.search( r'(\w*\/\d+).*\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).*(\s+up\s+)',test ).groups()
    print(ret) # 運(yùn)行結(jié)果: ('GigabitEthernet0/3', '10.1.8.1', ' up ')

    #1. (\w*\d+\/\d+) 匹配結(jié)果為:GigabitEthernet0/3
    #1.1 \w*: 匹配所有字母數(shù)字
    #1.2 /\d+:匹配所有斜杠開(kāi)頭后根數(shù)字 (比如:/3 )

    #2. (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) 匹配結(jié)果為:10.1.8.1

    #3. \s+up\s+ 匹配結(jié)果為: up 這個(gè)單詞,,前后都為空格

    4、re模塊其他知識(shí)點(diǎn)

    re匹配忽略大小寫(xiě),,匹配換行

    import re
    #匹配時(shí)忽略大小寫(xiě)
    print(re.search("[a-z]+","abcdA").group()) #abcd
    print(re.search("[a-z]+","abcdA",flags=re.I).group()) #abcdA
    #連同換行符一起匹配:
    #'.'默認(rèn)匹配除\n之外的任意一個(gè)字符,,若指定flag DOTALL,則匹配任意字符,包括換行
    print(re.search(r".+","\naaa\nbbb\nccc").group()) #aaa
    print(re.search(r".+","\naaa\nbbb\nccc",flags=re.S))
    #<_sre.SRE_Match object; span=(0, 12), match='\naaa\nbbb\nccc'>
    print(re.search(r".+","\naaa\nbbb\nccc",flags=re.S).group())
    aaa
    bbb
    ccc

    計(jì)算器用到的幾個(gè)知識(shí)點(diǎn)

    1)init_l=[i for i in re.split('(\-\d+\.*\d*)',expression) if i]
    a. 按照類(lèi)似負(fù)數(shù)的字符串分割成列表
    b. \-\d+\.*\d*是為了可以匹配浮點(diǎn)數(shù)(比如:3.14)
    c. (if i)是為了去除列表中的空元素
    d. 分割結(jié)果:['-1', '-2', '*((', '-60', '+30+(',
    2)re.search('[\+\-\*\/\(]$',expression_l[-1])
    a. 匹配expression_l列表最后一個(gè)元素是 +,-,*,/,( 這五個(gè)符號(hào)就是負(fù)數(shù)
    3)new_l=[i for i in re.split('([\+\-\*\/\(\)])',exp) if i]
    a. 將字符串按照+,-,*,/,(,)切分成列表(不是正真的負(fù)數(shù)就切分)
    4)print(re.split('([\+\-])','-1+2-3*(2*2+3)')) #按照加號(hào)或者減號(hào)分割成列表
    運(yùn)行結(jié)果: ['', '-', '1', '+', '2', '-', '3*(2*2', '+', '3)']

    注:文章轉(zhuǎn)載自互聯(lián)網(wǎng)

      本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶(hù)發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
      轉(zhuǎn)藏 分享 獻(xiàn)花(0

      0條評(píng)論

      發(fā)表

      請(qǐng)遵守用戶(hù) 評(píng)論公約

      類(lèi)似文章 更多