Week5-python(模塊)

week5node

1 定義python

模塊: 用來從邏輯上組織python代碼,本質是.py結尾的python文件。正則表達式

包:用來從邏輯上組織模塊的,本質是一個目錄(必須存在一個_init_.py文件)。算法

2 導入方法shell

import module_namejson

import module1_name,module2_namebash

from module_name import *   #導入module中全部內容,不建議使用,不能經過module_name.方式調用模塊中的函數,而是直接經過函數名調用網絡

from module_name import def1_name,def2_nameapp

from module_name import def_name as 別名dom

3 import本質

import module_name ----> module_name = all code #將module代碼解釋後賦值給module_name

from module_name import def_name ---> 將 def_name 直接複製到當前文件中執行

導入模塊的本質就是把python文件解釋一遍。

導入包的本質就是執行該包下的_init_.py文件。

4 導入優化

import module_name ---> module_name.py ---> module_name.py的路徑 ---> sys.path

import os
import sys

print(__file__) # 打印相對路徑
print(os.path.abspath(__file__)) # 打印絕對路徑
print(os.path.dirname(os.path.abspath(__file__))) # 父目錄路徑
print(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) # 父父目錄路徑
PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

sys.path.append(PATH) # 加入環境變量 sys.path是個list,可使用sys.path.insert插入
from core import main
main.atm()

在_init_文件導入模塊:from . import module_name #在當前目錄下導入module

在python文件中導入包:import passage_name,能夠在文件中passage_name.module_name.def_name調用module中的方法

5 模塊分類

  1. 標準庫(內置模塊);
  2. 開源模塊(第三方模塊);
  3. 自定義模塊。

5.1 時間模塊(time&datatime)

5.1.1 時間表示形式

UTC(Coordinated Universal Time,世界協調時)亦即格林威治天文時間,世界標準時間。在中國爲UTC+8。

表示時間方式:1)時間戳 2)格式化的時間字符串 3)元組(struct_time)共九個元素。

import time

# <1> 時間戳
print(time.time()) # 時間戳:1521424491.5176704
# <2> 時間字符串
print(time.strftime("%Y-%m-%d %X")) #格式化的時間字符串:'2018-03-19 09:54:51'
# <3> 時間元組
print(time.localtime()) #本地時區的struct_time:'time.struct_time(tm_year=2018, tm_mon=3, tm_mday=19, tm_hour=9, tm_min=54, tm_sec=51, tm_wday=0, tm_yday=78, tm_isdst=0)'
print(time.gmtime())    #UTC時區的struct_time:isdst爲時區

5.1.2 時間的轉換

#時間戳<- - ->結構化時間:  localtime/gmtime/mktime

print(time.localtime(3600*24))
print(time.gmtime(3600*24))
print(time.mktime(time.localtime()))

#字符串時間<- - ->結構化時間: strftime/strptime
print(time.strftime("%Y-%m-%d %X", time.localtime()))
print(time.strptime("2017-03-16","%Y-%m-%d"))

 

print(time.asctime(time.localtime()))
print(time.ctime(1521425493.0))

5.1.3 其餘方法

#延遲時間
time.sleep(seconds)

#時間加減
import datetime

print(datetime.datetime.now()) #返回當前時間 2018-03-19 10:17:39.694514
print(datetime.date.fromtimestamp(time.time()) ) # 時間戳直接轉成日期格式 2018-03-19
print(datetime.datetime.now() + datetime.timedelta(3)) #當前時間+3天
print(datetime.datetime.now() + datetime.timedelta(-3)) #當前時間-3天
print(datetime.datetime.now() + datetime.timedelta(hours=3)) #當前時間+3小時
print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #當前時間+30分

c_time = datetime.datetime.now()
print(c_time.replace(minute=3,hour=2)) #時間替換

5.2 ramdon模塊

import random

print(random.random())  # (0,1)float 大於0且小於1之間的小數
print(random.randint(1, 3))  # [1,3] 大於等於1且小於等於3之間的整數
print(random.randrange(1, 3))  # [1,3) 大於等於1且小於3之間的整數
print(random.choice([1, '23', [4, 5]]))  # 1或者23或者[4,5]
print(random.sample([1, '23', [4, 5]], 2))  # 列表元素任意2個組合
print(random.uniform(1, 3))  # 大於1小於3的小數,如1.927109612082716

item = [1, 3, 5, 7, 9]
random.shuffle(item)  # 打亂item的順序,至關於"洗牌"
print(item)

生成隨機驗證碼

import random
def make_code(n):
    res=''
    for i in range(n):
        s1=chr(random.randint(65,90))
        s2=str(random.randint(0,9))
        res+=random.choice([s1,s2])
    return res

print(make_code(4))

5.3 os模塊

'''
os.getcwd() 獲取當前工做目錄,即當前python腳本工做的目錄路徑
os.chdir("dirname")  改變當前腳本工做目錄;至關於shell下cd
os.curdir  返回當前目錄: ('.')
os.pardir  獲取當前目錄的父目錄字符串名:('..')
os.makedirs('dirname1/dirname2')    可生成多層遞歸目錄
os.removedirs('dirname1')    若目錄爲空,則刪除,並遞歸到上一級目錄,如若也爲空,則刪除,依此類推
os.mkdir('dirname')    生成單級目錄;至關於shell中mkdir dirname
os.rmdir('dirname')    刪除單級空目錄,若目錄不爲空則沒法刪除,報錯;至關於shell中rmdir dirname
os.listdir('dirname')    列出指定目錄下的全部文件和子目錄,包括隱藏文件,並以列表方式打印
os.remove()  刪除一個文件
os.rename("oldname","newname")  重命名文件/目錄
os.stat('path/filename')  獲取文件/目錄信息
os.sep    輸出操做系統特定的路徑分隔符,win下爲"\\",Linux下爲"/"
os.linesep    輸出當前平臺使用的行終止符,win下爲"\t\n",Linux下爲"\n"
os.pathsep    輸出用於分割文件路徑的字符串 win下爲;,Linux下爲:
os.name    輸出字符串指示當前使用平臺。win->'nt'; Linux->'posix'
os.system("bash command")  運行shell命令,直接顯示
os.environ  獲取系統環境變量
os.path.abspath(path)  返回path規範化的絕對路徑
os.path.split(path)  將path分割成目錄和文件名二元組返回
os.path.dirname(path)  返回path的目錄。其實就是os.path.split(path)的第一個元素
os.path.basename(path)  返回path最後的文件名。如何path以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素
os.path.exists(path)  若是path存在,返回True;若是path不存在,返回False
os.path.isabs(path)  若是path是絕對路徑,返回True
os.path.isfile(path)  若是path是一個存在的文件,返回True。不然返回False
os.path.isdir(path)  若是path是一個存在的目錄,則返回True。不然返回False
os.path.join(path1[, path2[, ...]])  將多個路徑組合後返回,第一個絕對路徑以前的參數將被忽略
os.path.getatime(path)  返回path所指向的文件或者目錄的最後訪問時間
os.path.getmtime(path)  返回path所指向的文件或者目錄的最後修改時間
os.path.getsize(path) 返回path的大小
'''

5.4 sys模塊

'''
sys.argv           命令行參數List,第一個元素是程序自己路徑,可傳參
sys.exit(n)        退出程序,正常退出時exit(0)
sys.version        獲取Python解釋程序的版本信息
sys.maxint         最大的Int值
sys.path           返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值
sys.platform       返回操做系統平臺名稱
'''

5.5 shutil模塊

import shutil
f1= open('file1','r',encoding='utf-8')
f2= open('file2','w',encoding='utf-8')
shutil.copyfileobj(f1,f2)  #將文件內容拷貝到另外一個文件中
import  shutil
shutil.copyfile('file2','file3') #拷貝文件,不須要打開文件,目標文件無需存在
import  shutil
shutil.copymode('file1','file2') #僅拷貝權限,內容、組、用戶均不變,目標文件必須存在
import  shutil
shutil.copystat('file1','file3') #僅拷貝狀態的信息,包括:mode bits, atime, mtime, flags,目標文件必須存在
import shutil
shutil.copy('file1','file2')#拷貝文件和權限
import shutil
shutil.copy2('file1','file2')#拷貝文件和狀態信息
import shutil
shutil.copytree('a','copy_a') #遞歸的去拷貝文件夾
import shutil
shutil.rmtree('copy_a') #遞歸的去刪除文件
import shutil
shutil.move('file3','a')#遞歸的去移動文件,它相似mv命令

壓縮文件:

  • base_name: 壓縮包的文件名,也能夠是壓縮包的路徑。只是文件名時,則保存至當前目錄,不然保存至指定路徑,

如 data_bak---->保存至當前路徑

如:/tmp/data_bak--->保存至/tmp/

  • format: 壓縮包種類,「zip」, 「tar」, 「bztar」,「gztar」
  • root_dir: 要壓縮的文件夾路徑(默認當前目錄)
  • owner: 用戶,默認當前用戶
  • group: 組,默認當前組
  • logger: 用於記錄日誌,一般是logging.Logger對象
import shutil
shutil.make_archive('archive_test','zip',r'C:\Users\zhouxy\PycharmProjects\untitled\day4') #講某路徑下全部文件壓縮到當前路徑
import zipfile
z = zipfile.ZipFile('file.zip','w') #在當前路徑下壓縮指定文件
z.write('file1')
print('-----')
z.write('file2')
z.close()

解壓文件:

import zipfile
z = zipfile.ZipFile('archive_test.zip', 'r')
z.extractall()
z.close()

5.6 json&pickle模塊

5.6.1 序列化緣由

1.持久保存狀態

2.跨平臺數據交互

5.6.2 序列化方式

 

5.7 shelve模塊

shelve模塊是一個簡單的k,v將內存數據經過文件持久化的模塊,能夠持久化任何pickle可支持的python數據格式。

import shelve

d = shelve.open('shelve_test') #打開一個文件
name = ["zhouxy", "female", 18]
d["test"] = name  # 持久化列表
d['info']={'name':'zhouxy','age':18} #持久化dict
print(d.get('test'))
print(d.get('info'))
d.close()

5.8 xml模塊

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank updated="yes">69</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>
View Code
import xml.etree.cElementTree as ET

tree = ET.parse('xml_test.xml')
root = tree.getroot()
print(root.tag)
#遍歷xml文檔
for child in root:
    print(child.tag,child.attrib)
    for i in child:
        print(i.tag,i.text,i.attrib)
#遍歷year節點
for note in root.iter('year'):
    print(note.tag,note.text)
import xml.etree.cElementTree as ET

tree = ET.parse('xml_test.xml')
root = tree.getroot()

#修改
for node in root.iter('year'):
    new_year = int(node.text)+1
    node.text = str(new_year)
    node.set('updated','zhouxy') #增長屬性
tree.write('xml_test.xml')

#刪除
for country in root.findall('country'):
    rank = int(country.find('rank').text)
    if rank > 50:
        root.remove(country)
tree.write('xml_test.xml')

建立xml文檔

import xml.etree.ElementTree as ET

name_xml = ET.Element("namelist")  #建立根節點並賦值給一個對象
name = ET.SubElement(name_xml, "name", attrib={"enrolled": "yes"}) #建立一級子節點
name.text = 'zhouxy'
age = ET.SubElement(name, "age", attrib={"checked": "no"}) #建立二級子節點
age.text = '18'
sex = ET.SubElement(name, "sex") #建立二級子節點
sex.text = 'F'
name2 = ET.SubElement(name_xml, "name", attrib={"enrolled": "no"})
age = ET.SubElement(name2, "age")

et = ET.ElementTree(name_xml)  # 生成文檔對象
et.write("name.xml", encoding="utf-8", xml_declaration=True)

ET.dump(name_xml)  # 打印生成的格式

5.9 ConfigParser模塊

用於生成和修改常見配置文檔。文檔格式以下:

[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes
 
[bitbucket.org]
User = hg
 
[topsecret.server.com]
Port = 50022
ForwardX11 = no
View Code
import configparser # python2.X 爲 ConfigParser

config = configparser.ConfigParser() # 建立一個config對象
config["DEFAULT"] = {'ServerAliveInterval': '45',
                     'Compression': 'yes',
                     'CompressionLevel': '9'}
config['DEFAULT']['ForwardX11'] = 'yes'

config['bitbucket.org'] = {}
config['bitbucket.org']['User'] = 'hg'

config['topsecret.server.com'] = {}
topsecret = config['topsecret.server.com']
topsecret['Host Port'] = '50022'
topsecret['ForwardX11'] = 'no'

with open('example.conf', 'w') as configfile:
    config.write(configfile)
# 讀取
import configparser

config=configparser.ConfigParser()
config.read('db.conf')

print(config.defaults()) # 查看default全部內容
print(config.sections()) #查看全部的標題
print(config.options('bitbucket.org')) #查看標題bitbucket.org和default下全部key=value的key,與default相同的key不重複顯示
print(config.items('bitbucket.org')) #查看標題bitbucket.org下和default全部key=value的(key,value)格式

print(config.get('bitbucket.org','User')) #查看標題bitbucket.org下User的值=>字符串格式
print(config.getint('DEFAULT','ServerAliveInterval'))#查看標題default下ServerAliveInterval的值=>整數格式
print(config.getboolean('DEFAULT','ForwardX11')) #查看標題default下ForwardX11的值=>布爾值格式
print(config.getfloat('topsecret.server.com','Port')) #查看標題topsecret.server.com下Port的值=>浮點型格式
import configparser

config=configparser.ConfigParser()
config.read('example.conf',encoding='utf-8')

config.remove_section('bitbucket.org') #刪除整個標題bitbucket.org
config.remove_option('topsecret.server.com','ForwardX11') #刪除標題topsecret.server.com下的某個ForwardX11
print(config.has_section('bitbucket.org')) #判斷是否存在某個標題
print(config.has_option('topsecret.server.com','ForwardX11')) #判斷標題topsecret.server.com和default下是否存在ForwardX11

config.add_section('zhouxy') #添加一個標題
config.set('zhouxy','name','zhouxy') #在標題zhouxy下添加name=zhouxy,age=18的配置
#config.set('egon','age',18) #報錯,必須是字符串
config.write(open('example.conf','w')) #最後將修改的內容寫入文件,完成最終的修改

5.10 hashlib模塊

hash:一種加密算法 ,3.x裏代替了md5模塊和sha模塊,主要提供 SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法。
三個特色:

  1. 內容相同則hash運算結果相同,內容稍微改變則hash值則變;
  2. 不可逆推;
  3. 相同算法:不管校驗多長的數據,獲得的哈希值長度固定。
import hashlib

m = hashlib.md5()
m.update('hello'.encode('utf-8')) #5d41402abc4b2a76b9719d911017c592
print(m.hexdigest())
m.update('it’s me'.encode('utf-8')) #不管update多少次,校驗的內容累加到一塊兒是同樣的內容 e36c615cdab6d98c413121f3b90de97a 
print(m.hexdigest())

m2
= hashlib.md5()
m2.update(
'helloit’s me'.encode('utf-8'))
print(m2.hexdigest()) #16進制格式hash e36c615cdab6d98c413121f3b90de97a
print(m2.digest()) #2進制格式hash

python 還有一個 hmac 模塊。

散列消息鑑別碼,簡稱HMAC,是一種基於消息鑑別碼MAC(Message Authentication Code)的鑑別機制。使用HMAC時,消息通信的雙方,經過驗證消息中加入的鑑別密鑰K來鑑別消息的真僞。通常用於網絡通訊中消息加密,前提是雙方先要約定好key,就像接頭暗號同樣,而後消息發送把用key把消息加密,接收方用key+消息明文再加密,拿加密後的值 跟發送者的相對比是否相等,這樣就能驗證消息的真實性,及發送者的合法性了。

import hmac

h = hmac.new('阿里巴巴'.encode('utf-8'),'芝麻開門'.encode('utf-8'))
print(h.hexdigest())

h2 = hmac.new('阿里巴巴'.encode('utf-8'))
h2.update('芝麻開門'.encode('utf-8'))
print(h2.hexdigest())

5.11 re模塊

re模塊用於對python的正則表達式的操做。

元字符:. ^ $

import re
#默認匹配除\n以外的任意一個字符
ret1=re.findall('李.','李一\na\n李二\nb\nc\n李三')  #['李一', '李二', '李三']
#匹配字符開頭\A
ret2=re.findall('^李.','李一\na\n李二\nb\nc\n李三') #['李一']
#匹配字符結尾\Z
ret3=re.findall('李.$','李一\na\n李二\nb\nc\n李三') #['李三']

* + ? { }

import re
#匹配*號前的字符0次或屢次
ret1=re.findall('李.*','李一\na\n李二\nb\nc\n李三') #['李一', '李二', '李三']
#匹配前一個字符1次或屢次
ret2=re.findall('李.+','李一\na\n李二\nb\nc\n李三') #['李一', '李二', '李三']
#匹配前一個字符n到m次
ret3=re.findall('(李.{1,2})\n','李一\na\n李二\nb\nc\n李三') #設定優先級的緣由
#['李一', '李二']

#匹配一個數字包括整型和浮點型
ret4=re.findall('\d+\.?\d*','12.45,34,0.05,109')  #['12.45', '34', '0.05', '109']

注意:前面的*,+,?等都是貪婪匹配,也就是儘量匹配,後面加?號使其變成惰性匹配。

ret=re.findall('13\d+?','1312312312')
print(ret)  #['131']

轉義符 \

\d  匹配任何十進制數;      它至關於類 [0-9]。
\D  匹配任何非數字字符;    它至關於類 [^0-9]。
\s  匹配任何空白字符;      它至關於類 [\t\n\r\f\v]。
\S  匹配任何非空白字符;    它至關於類 [^\t\n\r\f\v]。
\w  匹配任何字母數字字符;   它至關於類 [a-zA-Z0-9_]。
\W  匹配任何非字母數字字符; 它至關於類 [^a-zA-Z0-9_]
\b  匹配一個特殊字符邊界,好比空格 ,&,#等,

分組 ()

m = re.findall(r'(ad)+', 'add')
print(m) #['ad']

ret = re.search('(?P<id>\d{2})/(?P<name>\w{3})', '23/com')
print(ret.group())  # 23/com
print(ret.group('id'))  # 23

元字符之|

#匹配|左或|右的字符
ret=re.search('(ab)|\d','rabhdg8ab')
print(ret.group())#ab

字符集[]

ret1 = re.findall('a[bc]d', 'acd')
print(ret1)  # ['acd']
ret2 = re.findall('[a-z]', 'acd')
print(ret2)  # ['a', 'c', 'd']
ret3 = re.findall('[.*+]', 'a.cd+')
print(ret3)  # ['.', '+']

# 在字符集裏有功能的符號: - ^ \
ret4 = re.findall('[1-9]', '45dha3')
print(ret4)  # ['4', '5', '3']
ret5 = re.findall('[^ab]', '45bdha3')
print(ret5)  # ['4', '5', 'd', 'h', '3']
ret6 = re.findall('[\d]', '45bdha3')
print(ret6)  # ['4', '5', '3']

經常使用方法

match()  # 同search,不過僅在字符串開始處進行匹配
search() # 函數會在字符串內查找模式匹配,只到找到第一個匹配而後返回一個包含匹配信息的對象,該對象能夠經過調用group()方法獲得匹配的字符串,若是字符串沒有匹配,則返回None。
findall() # 返回全部知足匹配條件的結果,放在列表裏
split('[ab]', 'abcd') # 先按'a'分割獲得''和'bcd',在對''和'bcd'分別按'b'分割
sub('a','A','appleapc',2)) # AppleApc
ret = re.search('(?P<num>[0-9]{2})(?P<name>[a-z]+)','abc123zxy321').groupdict() #{'num': '23', 'name': 'zxy'}

幾個匹配模式

re.I(re.IGNORECASE): 忽略大小寫(括號內是完整寫法,下同)
M(MULTILINE): 多行模式,改變'^''$'的行爲
S(DOTALL): 點任意匹配模式,改變'.'的行爲
相關文章
相關標籤/搜索