1. 程式人生 > >Python開發【第六篇】:模組

Python開發【第六篇】:模組

模組,用一砣程式碼實現了某個功能的程式碼集合。 

類似於函數語言程式設計和麵向過程程式設計,函數語言程式設計則完成一個功能,其他程式碼用來呼叫即可,提供了程式碼的重用性和程式碼間的耦合。而對於一個複雜的功能來,可能需要多個函式才能完成(函式又可以在不同的.py檔案中),n個 .py 檔案組成的程式碼集合就稱為模組。

如:os 是系統相關的模組;file是檔案操作相關的模組

模組分為三種:

  • 自定義模組
  • 第三方模組
  • 內建模組

自定義模組

1、定義模組

情景一:

  

情景二:

  

情景三:

  

2、匯入模組

Python之所以應用越來越廣泛,在一定程度上也依賴於其為程式設計師提供了大量的模組以供使用,如果想要使用模組,則需要匯入。匯入模組有一下幾種方法:

1 2 3 4 import  module from  module.xx.xx  import  xx
from  module.xx.xx  import  xx as rename  from  module.xx.xx  import  *

匯入模組其實就是告訴Python直譯器去解釋那個py檔案

  • 匯入一個py檔案,直譯器解釋該py檔案
  • 匯入一個包,直譯器解釋該包下的 __init__.py 檔案 【py2.7】

那麼問題來了,匯入模組時是根據那個路徑作為基準來進行的呢?即:sys.path

1 2 3 4 5 import  sys print  sys.path     結果: [ '/Users/wupeiqi/PycharmProjects/calculator/p1/pp1' '/usr/local/lib/python2.7/site-packages/setuptools-15.2-py2.7.egg' '/usr/local/lib/python2.7/site-packages/distribute-0.6.28-py2.7.egg' '/usr/local/lib/python2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.10-x86_64.egg' '/usr/local/lib/python2.7/site-packages/xlutils-1.7.1-py2.7.egg' '/usr/local/lib/python2.7/site-packages/xlwt-1.0.0-py2.7.egg' '/usr/local/lib/python2.7/site-packages/xlrd-0.9.3-py2.7.egg' '/usr/local/lib/python2.7/site-packages/tornado-4.1-py2.7-macosx-10.10-x86_64.egg' '/usr/local/lib/python2.7/site-packages/backports.ssl_match_hostname-3.4.0.2-py2.7.egg' '/usr/local/lib/python2.7/site-packages/certifi-2015.4.28-py2.7.egg' '/usr/local/lib/python2.7/site-packages/pyOpenSSL-0.15.1-py2.7.egg' '/usr/local/lib/python2.7/site-packages/six-1.9.0-py2.7.egg' '/usr/local/lib/python2.7/site-packages/cryptography-0.9.1-py2.7-macosx-10.10-x86_64.egg' '/usr/local/lib/python2.7/site-packages/cffi-1.1.1-py2.7-macosx-10.10-x86_64.egg' '/usr/local/lib/python2.7/site-packages/ipaddress-1.0.7-py2.7.egg' '/usr/local/lib/python2.7/site-packages/enum34-1.0.4-py2.7.egg' '/usr/local/lib/python2.7/site-packages/pyasn1-0.1.7-py2.7.egg' '/usr/local/lib/python2.7/site-packages/idna-2.0-py2.7.egg' '/usr/local/lib/python2.7/site-packages/pycparser-2.13-py2.7.egg' '/usr/local/lib/python2.7/site-packages/Django-1.7.8-py2.7.egg' '/usr/local/lib/python2.7/site-packages/paramiko-1.10.1-py2.7.egg' '/usr/local/lib/python2.7/site-packages/gevent-1.0.2-py2.7-macosx-10.10-x86_64.egg' '/usr/local/lib/python2.7/site-packages/greenlet-0.4.7-py2.7-macosx-10.10-x86_64.egg' '/Users/wupeiqi/PycharmProjects/calculator' '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python27.zip' '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7' '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin' '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac' '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages' '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk' '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old' '/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload' '/usr/local/lib/python2.7/site-packages' '/Library/Python/2.7/site-packages' ]

如果sys.path路徑列表沒有你想要的路徑,可以通過 sys.path.append('路徑') 新增。

1 2 3 4 import  sys import  os project_path  =  os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(project_path)

模組

內建模組是Python自帶的功能,在使用內建模組相應的功能時,需要【先匯入】再【使用】

一、sys

用於提供對Python直譯器相關的操作:

1 2 3 4 5 6 7 8 9 sys.argv           命令列引數 List ,第一個元素是程式本身路徑 sys.exit(n)        退出程式,正常退出時exit( 0 ) sys.version        獲取Python解釋程式的版本資訊 sys.maxint         最大的 Int sys.path           返回模組的搜尋路徑,初始化時使用PYTHONPATH環境變數的值 sys.platform       返回作業系統平臺名稱 sys.stdin          輸入相關 sys.stdout         輸出相關 sys.stderror       錯誤相關
  進度百分比

二、os

用於提供系統級別的操作:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 os.getcwd()                 獲取當前工作目錄,即當前python指令碼工作的目錄路徑 os.chdir( "dirname" )         改變當前指令碼工作目錄;相當於shell下cd os.curdir                   返回當前目錄: ( '.' ) os.pardir                   獲取當前目錄的父目錄字串名:( '..' ) os.makedirs( 'dir1/dir2' )    可生成多層遞迴目錄 os.removedirs( 'dirname1' )   若目錄為空,則刪除,並遞迴到上一級目錄,如若也為空,則刪除,依此類推 os.mkdir( 'dirname' )         生成單級目錄;相當於shell中mkdir dirname os.rmdir( 'dirname' )         刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname os.listdir( 'dirname' )       列出指定目錄下的所有檔案和子目錄,包括隱藏檔案,並以列表方式列印 os.remove()                 刪除一個檔案 os.rename( "oldname" , "new" )  重新命名檔案 / 目錄 os.stat( 'path/filename' )    獲取檔案 / 目錄資訊 os.sep                      作業系統特定的路徑分隔符,win下為 "\\",Linux下為" / " os.linesep                  當前平臺使用的行終止符,win下為 "\t\n" ,Linux下為 "\n" os.pathsep                  用於分割檔案路徑的字串 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所指向的檔案或者目錄的最後修改時間

三、hashlib

用於加密相關的操作,代替了md5模組和sha模組,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 演算法

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 import  hashlib   # ######## md5 ######## hash  =  hashlib.md5() # help(hash.update) hash .update(bytes( 'admin' , encoding = 'utf-8' )) print ( hash .hexdigest()) print ( hash .digest())     ######## sha1 ########   hash  =  hashlib.sha1() hash .update(bytes( 'admin' , encoding = 'utf-8' )) print ( hash .hexdigest())   # ######## sha256 ########   hash  =  hashlib.sha256() hash .update(bytes( 'admin' , encoding = 'utf-8' )) print ( hash .hexdigest())     # ######## sha384 ########   hash  =  hashlib.sha384() hash .update(bytes( 'admin' , encoding = 'utf-8' )) print ( hash .hexdigest())   # ######## sha512 ########   hash  =  hashlib.sha512() hash .update(bytes( 'admin' , encoding = 'utf-8' )) print ( hash .hexdigest())

以上加密演算法雖然依然非常厲害,但時候存在缺陷,即:通過撞庫可以反解。所以,有必要對加密演算法中新增自定義key再來做加密。

1 2 3 4 5 6 7 import  hashlib   # ######## md5 ########   hash  =  hashlib.md5(bytes( '898oaFs09f' ,encoding = "utf-8" )) hash .update(bytes( 'admin' ,encoding = "utf-8" )) print ( hash .hexdigest())

python內建還有一個 hmac 模組,它內部對我們建立 key 和 內容 進行進一步的處理然後再加密

1 2 3 4 5 import  hmac   =  hmac.new(bytes( '898oaFs09f' ,encoding = "utf-8" )) h.update(bytes( 'admin' ,encoding = "utf-8" )) print (h.hexdigest())

四、random

1 2 3 4 5 import  random   print (random.random()) print (random.randint( 1 2 )) print (random.randrange( 1 10 ))
  隨機驗證碼

五、re

python中re模組提供了正則表示式相關操作

 

字元:

 

  . 匹配除換行符以外的任意字元
  \w 匹配字母或數字或下劃線或漢字
  \s 匹配任意的空白符
  \d 匹配數字
  \b 匹配單詞的開始或結束
  ^ 匹配字串的開始
  $ 匹配字串的結束

 

次數:

 

  * 重複零次或更多次
  + 重複一次或更多次
  ? 重複零次或一次
  {n} 重複n次
  {n,} 重複n次或更多次
  {n,m} 重複n到m次

 

match

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 # match,從起始位置開始匹配,匹配成功返回一個物件,未匹配成功返回None       match(pattern, string, flags = 0 )   # pattern: 正則模型   # string : 要匹配的字串   # falgs  : 匹配模式       X  VERBOSE     Ignore whitespace  and  comments  for  nicer looking RE's.       I  IGNORECASE  Perform case - insensitive matching.       M  MULTILINE    "^"  matches the beginning of lines (after a newline)                      as well as the string.                      "$"  matches the end of lines (before a newline) as well                      as the end of the string.       S  DOTALL       "."  matches  any  character at  all , including the newline.         A  ASCII       For string patterns, make \w, \W, \b, \B, \d, \D                      match the corresponding ASCII character categories                      (rather than the whole  Unicode  categories, which  is  the                      default).                      For bytes patterns, this flag  is  the only available                      behaviour  and  needn't be specified.              L  LOCALE      Make \w, \W, \b, \B, dependent on the current locale.       U   UNICODE      For compatibility only. Ignored  for  string patterns (it                      is  the default),  and  forbidden  for  bytes patterns.
  Demo

search

1 2 # search,瀏覽整個字串去匹配第一個,未匹配成功返回None # search(pattern, string, flags=0)
  demo

findall

1 2 3 # findall,獲取非重複的匹配列表;如果有一個組則以列表形式返回,且每一個匹配均是字串;如果模型中有多個組,則以列表形式返回,且每一個匹配均是元祖; # 空的匹配也會包含在結果中 #findall(pattern, string, flags=0)
  Demo

sub

1 2 3 4 5 6 7 8 # sub,替換匹配成功的指定位置字串   sub(pattern, repl, string, count = 0 , flags = 0 ) # pattern: 正則模型 # repl   : 要替換的字串或可執行物件 # string : 要匹配的字串 # count  : 指定匹配個數 # flags  : 匹配模式
  Demo

split

1 2 3 4 5 6 7 # split,根據正則匹配分割字串   split(pattern, string, maxsplit = 0 , flags = 0 ) # pattern: 正則模型 # string : 要匹配的字串 # maxsplit:指定分割個數 # flags  : 匹配模式
  Demo   常用正則表示式

六、序列化

Python中用於序列化的兩個模組

  • json     用於【字串】和 【python基本資料型別】 間進行轉換
  • pickle   用於【python特有的型別】 和 【python基本資料型別】間進行轉換

Json模組提供了四個功能:dumps、dump、loads、load

pickle模組提供了四個功能:dumps、dump、loads、load

 

七、configparser

configparser用於處理特定格式的檔案,其本質上是利用open來操作檔案。

  指定格式

1、獲取所有節點

1 2 3 4 5 6 i