想做Python開發,這14種常用Python模塊,你必須知道!
之前有小夥伴留言分享,希望可以更新寫關於Python OS模塊和SYS模塊方面的文章,今天小七特地給大家整理了下噢,有需要的建議可以收藏起來喔~
1
一、模塊介紹
1. 定義:
模塊:本質就是.py結尾的python文件(文件名:test.py,對應的模塊名:test)
用來從邏輯上組織python代碼(變數,函數,類,邏輯:實現一個功能)
2. 語法:
? import 語句
當解釋器遇到import語句,如果模塊在當前的搜索路徑就會被導入。搜索路徑是一個解釋器會先進行搜索的所有目錄的列表。
導入模塊:
1、 import module1[, module2[,... moduleN]
調用符號:.
1、import os
2、print(os.sep)
3、print(os.getcwd())
? From…import 語句
Python的from語句讓你從模塊中導入一個指定的部分到當前命名空間中。語法如下:
1、from modname import name1[, name2[, ... nameN]]
From…import* 語句
把一個模塊的所有內容全都導入到當前的命名空間也是可行的,只需使用如下聲明:
1、from modname import *
這提供了一個簡單的方法來導入一個模塊中的所有項目。慎用 from…import *。
? import 和 from 的區別:
import導入使用時,加前綴 module.func()。相當於把模塊代碼放在當前文件中執行一遍。
from可以指定需要的函數或變數導入。
導入模塊和當前py文件都有同一個函數,調用會調用哪一個?
因為python是解釋型,所以後面覆蓋前面。
? from … import … as …
3. import本質
import 本質:
導入一個模塊本質就是解釋執行一個python文件
導入一個包本質就是解釋該包下的__init__.py文件
1、module = all_code(所有代碼)
2、import :本質把模塊所有代碼解釋一遍,複製給模塊名
3、from module import name :把這個模塊的代碼把哪一部分給解釋了,賦值給name
? __init__.py
包:本質就是一個目錄(必須帶有一個__init__.py文件),用來從邏輯上組織模塊
導入包,怎麼導入?
導入包的本質:執行包下面的__init__.py文件
導入包下的模塊
包下面的模塊,這樣調用是錯誤的
在__init__.py內容中導入模塊
1、from . import module
2、# "." 指的相對路徑,指的誰的相對路徑?__init__.py的相對路徑還是調用init的那個模塊的
3、指的是__init__.py的相對路徑。
4、路徑搜索和搜索路徑
上面提到的都是導入同級目錄下的模塊,如果不在同一個目錄下:
import module_name實際找module_name.py文件,是文件就一定要有路徑。
導入模塊就是:找到.py文件的位置,把它執行一遍,從哪裡找呢?sys.path.
1、>>> import sys
2、 >>> sys.path["", 3、"C:\Users\Administrator\AppData\Local\Programs\Python\Python35\python35.zip", "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\DLLs", "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib", "C:\Users\Administrator\AppData\Local\Programs\Python\Python35", "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\site-packages"]
1、sys.path.append() :追加到最後
2、# 所以:可以如下,動態添加路徑到第一
3、sys.path.insert
5. 導入優化
1、import module_test
2、# import導入情況,如果重複調用,python就會重複找,避免重複找,可以用from方式導入
3、from module_test import test
6. 阻止屬性導入
如果你不想讓某個模塊屬性被 「from module import *」 導入 , 那麼你可以給你不想導入的屬性名稱加上一個下劃線( _ )。 不過如果你導入了整個模塊或是你顯式地導入某個屬性這個隱藏數據的方法就不起作用了。
02
二、模塊的分類
a:標準庫
b:開源模塊-第三方模塊
c:自定義模塊
03
三、常用內置模塊
1、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下為"
",Linux下為"
"
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分割成目錄和文件名二元組返回,它僅僅是以 "PATH" 中最後一個 "/" 作為分隔符,分隔後,將索引為0的視為目錄(路徑),將索引為1的視為文件名
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所指向的文件或者目錄的最後修改時間
2、time和datetime
在Python中,通常有這幾種方式來表示時間:
時間戳
格式化的時間字元串
元組(struct_time)共九個元素。
由於Python的time模塊實現主要調用C庫,所以各個平台可能有所不同。
UTC(Coordinated Universal Time,世界協調時)亦即格林威治天文時間,世界標準時間。在中國為UTC+8。DST(Daylight Saving Time)即夏令時。
時間戳(timestamp)的方式:通常來說,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。我們運行「type(time.time())」,返回的是float類型。返回時間戳方式的函數主要有time(),clock()等。
元組(struct_time)方式:struct_time元組共有9個元素,返回struct_time的函數主要有gmtime(),localtime(),strptime()。
1、time.time() # 獲取時間戳:當前時間減1970-1-1 00:00 ==> 秒>>> time.localtime() # 本地時間,元組方式(tm_isdst() 是否夏令時)time.struct_time(tm_year=2016, tm_mon=8, tm_mday=29, tm_hour=θ, tm_min=51, tm_sec=37, tm_wday=θ, tm_yday=242, tm_isdst=θ)
2、help(time) # 模塊幫助>>> time.timezone # 查看時區-28800 # 28800/60秒/60分 = 8時 ==> utc --> 標準+8
3、time.sleep() # 時間睡幾秒time.gmtime() # 不加時間戳,為國際標準時間time.localtime() # 不加時間戳,本地時間# 加上則從1970年開始算。
? 時間轉為時間戳
1、>>> x = time.localtime()
2、 >>> x
3、time.struct_time(tm_year=2016, tm_mon=8, tm_mday=29, tm_hour=1, tm_min=θ, tm_sec=8, tm_wday=θ, tm_yday=242, tm_isdst=θ)
4、>>> time.mktime(x)
5、1472403608.θ
? 格式化時間字元串
1、>>> time.strftime("%Y-%m-%d %X",x)"/2、2016-08-29 01:00:08"
3、>>> time.strptime("2016-08-29 01:00:08","%Y-%m-%d %X")
4、time.struct_time(tm_year=2016, tm_mon=8, tm_mday=29, tm_hour=1, tm_min=0, tm_sec=8, tm_wday=0, tm_yday=242, tm_isdst=-1)
5、
6、strftime("格式",struct_time) --> "格式化字元串"
7、strptime("格式化字元串","格式") --> "struct_time"
? 轉化時間戳和元組到時間字元串
1、>>> time.asctime(time.localtime()) # tuple -> string"
2、Mon Aug 29 01:10:47 2016"
3、>>> time.ctime(888888888) # seconds -> string"
4、Tue Mar 3 09:34:48 1998"
? 時間加減
1、import datetime
2、
3、datetime.datetime.now() # 返回 2016-08-19 12:47:03.941925
4、datetime.date.fromtimestamp(time.time()) # 時間戳直接轉成日期格式 2016-08-19
5、
6、datetime.datetime.now() + datetime.timedelta(3) # 當前時間+3天
7、datetime.datetime.now() + datetime.timedelta(-3) # 當前時間-3天
8、datetime.datetime.now() + datetime.timedelta(hours=3) # 當前時間+3小時
9、datetime.datetime.now() + datetime.timedelta(minutes=30) # 當前時間+30分
3、random模塊
1、random.random() # 0~1之間的隨機
2、random.randint(1,3) # [1,2,3]
3、random.randrange(3) #[0,1,2]
4、
5、random.choice("hello") # 傳入序列隨機字
6、random.sample("hello",2) # 隨機兩個字母
7、random.uniform(1,3) # 1~3直接隨機
8、a = [1,2,3,4,5]
9、random.shuffle(a) # 洗牌,打亂
10、
11、importstring
12、"".join(random.sample(string.hexdigits,4)) # 隨機4位驗證碼
4、sys模塊
5、shutil模塊
高級的 文件、文件夾、拷貝、壓縮包等 處理模塊
6、ConfigParser
用於對特定的配置進行操作,當前模塊的名稱在 python 3.x 版本中變更為 configparser。
來看一個好多軟體的常見文檔格式如下
如果想用python生成一個這樣的文檔怎麼做呢?
? 生成
? 讀取出來
? configparser增刪改查語法
7、hashlib模塊
用於加密相關的操作,3.x里代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 演算法,hash 加密都是bytes類型
python 還有一個 hmac 模塊,它內部對我們創建 key 和 內容 再進行處理然後再加密
8、Subprocess模塊
調用subprocess.run(…)是推薦的常用方法,在大多數情況下能滿足需求,但如果你可能需要進行一些複雜的與系統的交互的話,你還可以用subprocess.Popen(),語法如下:
1、p = subprocess.Popen("find / -size +1000000 -exec ls -shl {} ;",shell=True,stdout=subprocess.PIPE)
2、print(p.stdout.read())
可用參數:
args:shell命令,可以是字元串或者序列類型(如:list,元組)
bufsize:指定緩衝。0 無緩衝,1 行緩衝,其他 緩衝區大小,負值 系統緩衝
stdin, stdout, stderr:分別表示程序的標準輸入、輸出、錯誤句柄
preexec_fn:只在Unix平台下有效,用於指定一個可執行對象(callable object),它將在子進程運行之前被調用
close_sfs:在windows平台下,如果close_fds被設置為True,則新創建的子進程將不會繼承父進程的輸入、輸出、錯誤管道。 所以不能將close_fds設置為True同時重定向子進程的標準輸入、輸出與錯誤(stdin, stdout, stderr)。
shell:同上
cwd:用於設置子進程的當前目錄
env:用於指定子進程的環境變數。如果env = None,子進程的環境變數將從父進程中繼承。
universal_newlines:不同系統的換行符不同,True -> 同意使用
startupinfo與createionflags只在windows下有效 將被傳遞給底層的CreateProcess()函數,用於設置子進程的一些屬性,如:主窗口的外觀,進程的優先順序等等
終端輸入的命令分為兩種:
?輸入即可得到輸出,如:ifconfig
? 輸入進行某環境,依賴再輸入,如:python
需要交互的命令示例
9、re-正則表達式模塊
常用正則表達式符號
最常用的匹配語法
分組匹配 和 group()、groups()、groupdict()
10、logging模塊
python的logging模塊提供了標準的日誌介面,你可以通過它存儲各種格式的日誌,logging的日誌可以分為 debug(), info(), warning(), error() and critical() 5個級別,下面我們看一下怎麼用。
最簡單用法
看一下這幾個日誌級別分別代表什麼意思
如果想把日誌寫到文件里,也很簡單
其中下面這句中的level=loggin.INFO意思是,把日誌紀錄級別設置為INFO,也就是說,只有比日誌是INFO或比INFO級別更高的日誌才會被紀錄到文件里,在這個例子, 第一條日誌是不會被紀錄的,如果希望紀錄debug的日誌,那把日誌級別改成DEBUG就行了。
如果想同時把log列印在屏幕和文件日誌里,就需要了解一點複雜的知識 了
11、json和pickle數據序列化
str eval
數據序列化
json只能處理簡單的,所有語言通用的,函數不能json序列化
pickle可以序列化python所有的數據類型
12、shelve 模塊
shelve模塊是一個簡單的k,v將內存數據通過文件持久化的模塊,可以持久化任何pickle可支持的python數據格式
13、xml處理模塊
xml是實現不同語言或程序之間進行數據交換的協議,跟json差不多,但json使用起來更簡單,json之前的交換方式
參考文檔:
http://www.cnblogs.com/alex3714/articles/5161349.html
14、PyYAML模塊
Python也可以很容易的處理ymal文檔格式,只不過需要安裝一個模塊,參考文檔:
http://pyyaml.org/wiki/PyYAMLDocumentation
GIF
GIF
更多資訊
GIF
※Python學習之多進程詳解
※Python數據分析常見庫介紹之Pandas
TAG:Python |