10四、模塊和包組

一、模塊

一個模塊就是一個包含了python定義和聲明的文件,文件名就是模塊名字加上.py的後綴。node

做用

若是退出python解釋器而後從新進入,那麼以前定義的函數或者變量都將丟失,所以一般將程序寫到文件中以便永久保存下來,須要時就經過python test.py方式去執行,或者把他們當作模塊來導入到其餘的模塊中,實現了功能的重複利用,python

1.1 import 語句

當解釋器遇到import語句,若是模塊在當前的搜索路徑就會被導入,若是不在當前路徑就會按照系統環境變量導入正則表達式

語法
import name1,name2

別名
impor name1 as name2

提示

模塊能夠包含可執行的語句和函數的定義,這些語句的目的是初始化模塊,它們只在模塊名第一次遇到導入import語句時才執行(import語句是能夠在程序中的任意位置使用的,且針對同一個模塊很import屢次,爲了防止你重複導入,python的優化手段是:第一次導入後就將模塊名加載到內存了,後續的import語句僅是對已經加載大內存中的模塊對象增長了一次引用,不會從新執行模塊內的語句)算法

1.2 From…import 語句

Python的from語句讓你從模塊中導入一個指定的部分到當前命名空間中。shell

語法
from modname import name1[, name2[, ... nameN]]

把一個模塊的全部內容全都導入到當前的命名空間也是可行的
from modname import *

別名
from modname import name1 as name2

1.3 標準模塊

time datetime 模塊

print(time.time())#做爲時間戳使用,是計算機 Unix 誕生的時間(1970)
print(time.altzone)#返回與utc時間的時間差,以秒計算\
print(time.asctime())#返回時間格式"Sat Feb 18 15:15:03 2017"
print(time.ctime()) #返回Fri Aug 19 12:38:29 2016 格式, 同上
print(time.localtime()) #返回本地時間 的struct time對象格式
print(time.gmtime())#返回utc的時間
print(time.strftime('%Y-%m-%d %H:%M:%S'))#自定義格式,2017-02-18 15:26:29
print(time.strptime('2017-02-18 15:26:29','%Y-%m-%d %H:%M:%S'))#將固定格式轉換爲時間對象

print(time.localtime(time.time()))#時間戳到時間對象的轉換
print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))#時間戳到自定義時間格式轉換

print(time.strptime('2017-02-18 15:43:11','%Y-%m-%d %H:%M:%S'))#自定義時間到時間對象的裝換
print(time.mktime(time.strptime('2017-02-18 15:43:11','%Y-%m-%d %H:%M:%S')))#自定義時間到時間戳的轉換

print(datetime.datetime.now()) #返回 2016-08-19 12:47:03.941925
print(datetime.datetime.now()) #返回 2016-08-19 12:47:03.941925
print(datetime.date.fromtimestamp(time.time()) )  # 時間戳直接轉成日期格式 2016-08-19
print(datetime.datetime.now() + datetime.timedelta(3)) #當前時間+3天
print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #當前時間+30分

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

random 模塊

  • random.random() 用於生成一個0到1的隨機符點數: 0 <= n < 1.0
  • random.randint(a, b),用於生成一個指定範圍內的整數。其中參數a是下限,參數b是上限,生成的隨機數n: a <= n <= b
  • random.randrange([start], stop[, step])從指定範圍內,按指定基數遞增的集合中 獲取一個隨機數。如:random.randrange(10, 100, 2),結果至關於從[10, 12, 14, 16, ... 96, 98]序列中獲取一個隨機數。random.randrange(10, 100, 2)在結果上與 random.choice(range(10, 100, 2) 等效。
  • random.choice(sequence) 從序列中獲取一個隨機元素。參數sequence表示一個有序類型。這裏要說明 一下:sequence在python不是一種特定的類型,而是泛指一系列的類型。list, tuple, 字符串都屬於sequenceprint(random.choice([1,'23',[4,5],'bac']))
  • random.sample(sequence, k) 從指定序列中隨機獲取指定長度的片段。sample函數不會修改原有序列
  • random.uniform(a, b) 用於生成一個指定範圍內的隨機符點數,兩個參數其中一個是上限,一個是下限。若是a > b,則生成的隨機數n: a <= n <= b。若是 a <b, 則 b <= n <= a。
  • random.shuffle(x[, random]) 用於將一個列表中的元素打亂。

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.normpath(path) 規範化路徑,轉換path的大小寫和斜槓編程

sys 模塊

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

pickle、json模塊

用於序列化的兩個模塊:
json,用於字符串 和 python數據類型間進行轉換
pickle,用於python特有的類型 和 python的數據類型間進行轉換json

Json模塊提供了四個功能:序列化(dumps、dump)、反序列化(loads、load)
pickle模塊提供了四個功能:序列化(dumps、dump)、反序列化(loads、load)bash

序列化:內存存儲方式轉換爲字符串
反序列化:字符串轉換爲內存存儲方式
json 與 pickle功能徹底相同,只是 json 只支持少許字符串格式,如:str、int、float、set、dict、list、tupleapp

import pickle
date = {
    'id': 6452523,
    'credit':15000,
    'balance':8000,
    'passwd':'asasda'
}

with open('account','wb') as df:
    df.write(pickle.dumps(date))

with open('account','rb') as df:
    print(pickle.loads(df.read()))

shutil 模塊

shutil.copyfileobj(fsrc, fdst[, length])將文件內容拷貝到另外一個文件中,能夠限制長度分次導入dom

shelve 模塊

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

f = shelve.open('logging')
f['name']=['a','b','c']
tmpe = f['name']#只能經過這樣的方式添加
tmpe.append('d')
f['name'] = tmpe

print(f)
f.close()

xml 模塊

xml是實現不一樣語言或程序之間進行數據交換的協議,跟json差很少,但json使用起來更簡單

import xml.etree.ElementTree as ET

tree = ET.parse("xmltest.xml")#parse 是解析的意思
root = tree.getroot()#根節點
print(root.tag)
 
#遍歷xml文檔,直接用循環嵌套就行tag是標記,text是數據,attrib是屬性
for child in root:
    print(child.tag, child.attrib)
    for i in child:
        print(i.tag,i.text)
 
#只遍歷year 節點,直接搜關鍵字便可
for node in root.iter('year'):
    print(node.tag,node.text)

#修改
for node in root.iter('year'):
    new_year = int(node.text) + 1
    node.text = str(new_year)
    node.set("updated","yes")
tree.write("xmltest.xml")
 
#刪除node
for country in root.findall('country'):
   rank = int(country.find('rank').text)
   if rank > 50:
     root.remove(country)
tree.write('output.xml')

#新建xml
new_xml = ET.Element("namelist")#根節點
name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"})
age = ET.SubElement(name,"age",attrib={"checked":"no"})
sex = ET.SubElement(name,"sex")
sex.text = '33'
name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"no"})
age = ET.SubElement(name2,"age")
age.text = '19'

et = ET.ElementTree(new_xml) #生成文檔對象
et.write("test.xml", encoding="utf-8",xml_declaration=True)#第一行聲明

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

configparser 模塊

在 python 2.x 版本中 configparser 須要大寫

#建立ConfigParser實例 
config=ConfigParser.ConfigParser()
#讀取模塊信息,不會顯示默認模塊
config.sections()
#讀取模塊下的參數,若是有 default 默認模塊也會顯示
config.options('section')
#返回section 模塊下,option 參數的值
config.get(section,option)
#返回section 模塊下,option 參數的鍵和值
config.itens('section')
#添加一個配置文件節點(str)
config.add_section(str)
#設置section節點中,鍵名爲option的值(val)  config.set(section,option,val)
#讀取文件
config.read(filename)
#寫入配置文件
config.write(obj_file)
#刪除某個模塊或該模塊的某個鍵
config.remove_option('section','option')

生成文件

import configparser
 
config = configparser.ConfigParser()
config["DEFAULT"] = {'ServerAliveInterval': '45',
                      'Compression': 'yes',
                     'CompressionLevel': '9'}
 
config['bitbucket.org'] = {}
config['bitbucket.org']['User'] = 'hg'
config['topsecret.server.com'] = {}
topsecret = config['topsecret.server.com']
topsecret['Host Port'] = '50022'     # mutates the parser
topsecret['ForwardX11'] = 'no'  # same here
config['DEFAULT']['ForwardX11'] = 'yes'
with open('example.ini', 'w') as configfile:
   config.write(configfile)

#生成以下格式
[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes

[bitbucket.org]
User = hg

[topsecret.server.com]
Port = 50022
ForwardX11 = no

修改已有的文件

>>> import configparser
>>> config = configparser.ConfigParser()
>>> config.sections()#查看配置文件中有哪些模塊,由於沒指定文件,因此是空的
[]
>>> config.read('example.ini')
['example.ini']
>>> config.sections()#此時有了,默認的模塊沒有顯示
['bitbucket.org', 'topsecret.server.com']
>>> 'bitbucket.org' in config#判斷是相應模塊是否存在
True
>>> 'bytebong.com' in config
False
>>> config['bitbucket.org']['User']#查看參數
'hg'
>>> config['DEFAULT']['Compression']
'yes'
>>> topsecret = config['topsecret.server.com']
>>> topsecret['ForwardX11']
'no'
>>> topsecret['Port']
'50022'
>>> for key in config['bitbucket.org']: print(key)
...
user
compressionlevel
serveraliveinterval
compression
forwardx11
>>> config['bitbucket.org']['ForwardX11']
'yes'

hashlib 模塊

用於加密相關的操做,3.x裏代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

import hashlib

m = hashlib.md5()
m.update(b'hello')
print(m.hexdigest())
m.update(b'my name is')
print(m.hexdigest())

m2 = hashlib.md5()
m2.update(b'hellomy name is')
print(m2.hexdigest())#16進制
print(m2.digest())#二進制
#輸出結果
5d41402abc4b2a76b9719d911017c592
144e390a38d33b5257b20558ac017ad1
144e390a38d33b5257b20558ac017ad1
b'\x14N9\n8\xd3;RW\xb2\x05X\xac\x01z\xd1'
#由於 m 的兩次結果是疊加的,就至關於 m2

# ######## sha1 ########
hash = hashlib.sha1()
hash.update('admin')
print(hash.hexdigest())

# ######## sha256 ########
hash = hashlib.sha256()
hash.update('admin')
print(hash.hexdigest())

# ######## sha384 ########
hash = hashlib.sha384()
hash.update('admin')
print(hash.hexdigest())

# ######## sha512 ########
hash = hashlib.sha512()
hash.update('admin')
print(hash.hexdigest())

subprocess 模塊

每次調用該模塊就至關於啓動新的進程

>>> retcode = subprocess.call("ls -l",shell=Ture)
#執行命令,打印命令結果

#執行命令,返回命令執行狀態 , 0 or 非0
>>> retcode = subprocess.call(["ls", "-l"])

#執行命令,若是命令結果爲0,就正常返回,不然拋異常
>>> subprocess.check_call(["ls", "-l"])
0

#接收字符串格式命令,返回元組形式,第1個元素是執行狀態,第2個是命令結果 
>>> subprocess.getstatusoutput('ls /bin/ls')
(0, '/bin/ls')

#接收字符串格式命令,並返回結果
>>> subprocess.getoutput('ls /bin/ls')
'/bin/ls'

#執行命令,並返回結果,注意是返回結果,不是打印,下例結果返回給res
>>> res=subprocess.check_output(['ls','-l'])
>>> res
b'total 0\ndrwxr-xr-x 12 alex staff 408 Nov 2 11:05 OldBoyCRM\n'

#上面那些方法,底層都是封裝的subprocess.Popen
poll()當子進程執行完後等到結果狀態
wait()等待子進程結果狀態
terminate() 殺掉所啓動進程
communicate() 等待任務結束
stdin 標準輸入
stdout 標準輸出
stderr 標準錯誤
pid
The process ID of the child process.

#例子
>>> p = subprocess.Popen("df -h|grep disk",stdin=subprocess.PIPE,stdout=subprocess.PIPE,shell=True)
>>> p.stdout.read()
b'/dev/disk1 465Gi 64Gi 400Gi 14% 16901472 104938142 14% /\n'

re 模塊

正則表達式模塊

經常使用符號

'.'     默認匹配除\n以外的任意一個字符,若指定flag DOTALL,則匹配任意字符,包括換行
'^'     匹配字符開頭,若指定flags MULTILINE,這種也能夠匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$'     匹配字符結尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也能夠
'*'     匹配*號前的字符0次或屢次,re.findall("ab*","cabb3abcbbac")  結果爲['abb', 'ab', 'a']
'+'     匹配前一個字符1次或屢次,re.findall("ab+","ab+cd+abb+bba") 結果['ab', 'abb']
'?'     匹配前一個字符1次或0次
'{m}'   匹配前一個字符m次
'{n,m}' 匹配前一個字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 結果'abb', 'ab', 'abb']
'|'     匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 結果'ABC'
'(...)' 分組匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 結果 abcabca456c
 
'\A'    只從字符開頭匹配,re.search("\Aabc","alexabc") 是匹配不到的
'\Z'    匹配字符結尾,同$
'\d'    匹配數字0-9
'\D'    匹配非數字
'\w'    匹配[A-Za-z0-9]
'\W'    匹配非[A-Za-z0-9]
's'     匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 結果 '\t'

經常使用匹配語法

re.match    從頭開始匹配
re.search   匹配包含
re.findall  把全部匹配到的字符放到以列表中的元素返回
re.splitall 以匹配到的字符當作列表分隔符
re.sub      匹配字符並替換

反斜槓的困擾
與大多數編程語言相同,正則表達式裏使用""做爲轉義字符,這就可能形成反斜槓困擾。假如你須要匹配文本中的字符"",那麼使用編程語言表示的正則表達式裏將須要4個反斜槓"\\":前兩個和後兩個分別用於在編程語言裏轉義成反斜槓,轉換成兩個反斜槓後再在正則表達式裏轉義成一個反斜槓。
Python裏的原生字符串很好地解決了這個問題,這個例子中的正則表達式可使用r"\"表示。一樣,匹配一個數字的"\d"能夠寫成r"\d"。有了原生字符串,你不再用擔憂是否是漏寫了反斜槓,寫出來的表達式也更直觀

二、包

包是一個分層次的文件目錄結構,它定義了一個由模塊及子包,和子包下的子包等組成的Python的應用環境。

2.1 注意事項

  1. 關於包相關的導入語句也分爲 import 和 from ... import ... 兩種,可是不管哪一種,不管在什麼位置,在導入時都必須遵循一個原則:凡是在導入時帶點的,點的左邊都必須是一個包,不然非法。能夠帶有一連串的點,如 item.subitem.subsubitem ,但都必須遵循這個原則。
  2. 對於導入後,在使用時就沒有這種限制了,點的左邊能夠是包,模塊,函數,類(它們均可以用點的方式調用本身的屬性)。
相關文章
相關標籤/搜索