python基礎學習16—-模組

sfencs發表於2018-09-20

模組(Module)的引入

 

import 模組名

 

呼叫模組中的函式的方式為

模組名.函式名

這種方式引入會相當於將模組中程式碼執行一遍,所以如果引入的模組中有輸出語句,那麼只寫import 模組名,執行也會顯示輸出。

若想只引入模組中的某個函式,可以使用如下方法

from 模組名 import 函式名

這樣可以直接使用函式名呼叫函式

但是有一個問題需要注意,這樣雖然只引入了所需要的函式,但是如上所說,若模組中有輸出語句,依然會執行

 

搜尋路徑

當要引入一個模組的時候,python直譯器需要對模組進行搜尋,搜尋的順序為

1.當前目錄

2.在 shell 變數 PYTHONPATH 下的每個目錄。

3.預設路徑,由安裝過程決定的

搜尋路徑都儲存在 system 模組的 sys.path 變數中,若我們想要尋找到我們自定義的不再當前目錄的模組,那麼我們可以在sys.path中

新增程式檔案所在的路徑。

 

import os
import sys
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(base_dir)

 

這裡__file__為當前檔案所在的相對路徑,通過abspath獲得絕對路徑,再通過dirname來去掉檔名,最終生成檔案目錄最高層的絕對路徑並新增到

搜尋路徑中。

在此基礎上,就可以使用以下方式引入不同包中的模組

from 包名 import 模組名

 

接下來簡單介紹一下一些常用的模組

time模組

time模組常用內建函式

1.time.time()

返回當前時間的時間戳(1970紀元後經過的浮點秒數)

2.time.localtime()

格式化時間戳為本地的時間

 

import time
print(time.localtime())
#time.struct_time(tm_year=2018, tm_mon=9, tm_mday=20, tm_hour=16, tm_min=31, tm_sec=32, tm_wday=3, tm_yday=263, tm_isdst=0)

 

3.time.asctime()

接受格式化元組形式的時間為引數,返回一個可讀形式的時間

time1=time.localtime()
print(time.asctime(time1))#Thu Sep 20 16:35:44 2018

4.time.ctime()

接受一個時間戳為引數,將其轉變為可讀形式的時間

print(time.ctime(time.time()))#Thu Sep 20 16:42:03 2018

5.time.strftime()

time.strftime(format,time)

接收以結構化時間元組為引數,並返回以可讀字串表示的當地時間,格式由引數format決定 

print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))#2018-09-20 16:46:30

%y 兩位數的年份表示(00-99)
%Y 四位數的年份表示(000-9999)
%m 月份(01-12)
%d 月內中的一天(0-31)
%H 24小時制小時數(0-23)
%I 12小時制小時數(01-12)
%M 分鐘數(00=59)
%S 秒(00-59)
%a 本地簡化星期名稱
%A 本地完整星期名稱
%b 本地簡化的月份名稱
%B 本地完整的月份名稱
%c 本地相應的日期表示和時間表示
%j 年內的一天(001-366)
%p 本地A.M.或P.M.的等價符
%U 一年中的星期數(00-53)星期天為星期的開始
%w 星期(0-6),星期天為星期的開始
%W 一年中的星期數(00-53)星期一為星期的開始
%x 本地相應的日期表示
%X 本地相應的時間表示
%Z 當前時區的名稱
%% %號本身

6.time.sleep()

time.sleep(sec)

表示將程式掛起sec秒

 

random模組

1.random.random()

生成一個0—1的隨機浮點數

2.random.uniform()

生成一個指定範圍的隨機浮點數

 

print(random.uniform(4,7))
print(random.uniform(7,4))

 

引數沒有必要第一個小,第二個大

3.random.randint()

生成一個指定範圍內的隨機整數

print(random.randint(4,7))#   4<= n<=7

這裡引數必須是第一個小於等於第二個引數

4.random.randrange()

生成一個指定範圍內的隨機整數,第三個引數為間隔

print(random.randrange(1,100,2))#1--100之間的一個隨機奇數

5.random.choic()

在一個序列中隨機選擇一項

print(random.choice([1,3,4,7,8]))

6.random.sample()

在序列中選取規定數量的元素放到一個列表中返回

print(random.sample([1,3,4,7,8],3))#[1,4,7]

7.random.shuffle()

將序列打亂,重排

list1=[1,3,4,7,8]
random.shuffle(list1)
print(list1)

 

os模組

1.os.name

對於Windows,它是`nt`,而對於Linux/Unix使用者,它是`posix`

print(os.name)

2.os.getcwd()

返回當前的工作目錄

3.os.listdir()

將指定目錄下的所有檔名返回到一個列表中,不區分目錄和檔案

print(os.listdir(os.getcwd()))

4.os.remove()

刪除指定檔案

5.os.rmdir()

刪除指定目錄

6.os.mkdir()

建立目錄,只能建一層

7.os.makedirs()

建立目錄,可以遞迴建立很多層

8.os.path.isfile()

判斷指定物件是否為檔案,是則返回True,否則返回False

9.os.path.isdir()

判斷指定物件是否為目錄,是則返回True,否則返回False

10.os.path.exists()

判斷檔案或目錄是否存在

11.os.path.split()

返回路徑的目錄和檔名到一個元組中

12.os.chdir()

改變當前工作目錄到指定的路徑

13.os.path.getsize()

獲得檔案的大小,如果為目錄則返回0

14.os.path.abspath()

返回絕對路徑

15.os.path.join(path, name)

連線目錄和檔名

16.os.path.basename(path)

返回檔名

17.os.path.dirname(path)

返回檔案路徑

18.os.sep

當前平臺的路徑分隔符

19.os.stat(path).st_size

返回檔案位元組單位的大小

 

sys模組

1.sys.argv

sys.argv列表,用於接收外部向程式傳遞的引數,列表第一項為當前py檔案的檔名,之後的元素為傳遞的引數。

例如在cmd執行py檔案可在其後加引數

2.sys.exit(n)

引數n為0表示正常退出,其他引數為異常,可以捕獲

3.sys.path

sys.path是一個列表,存放模組的搜尋路徑

4.sys.platform

返回當前平臺

5.sys.modules

sys.modules是一個全域性字典,該字典是python啟動後就載入在記憶體中。每當程式設計師匯入新的模組,sys.modules將自動記錄該模組。當第二次再匯入該模組時,python會直接到字典中查詢,從而加快了程式執行的速度。它擁有字典所擁有的一切方法

 

hashlib模組

這裡我們直接看一段程式碼

 

import hashlib

m=hashlib.md5()
m.update("hello world".encode("utf-8"))
print(m.hexdigest())#5eb63bbbe01eeed093cb22bb8f5acdc3

m.update("123".encode("utf-8"))
print(m.hexdigest())#46d7a9532282332f023c08fe25ff7105

n=hashlib.md5()
n.update("hello world123".encode("utf-8"))
print(n.hexdigest())#46d7a9532282332f023c08fe25ff7105

 

hashlib是用來加密的模組,上述第二個m.update就相當於在之前的字串後邊加上123,然後再次加密

除了md5加密方式還有 sha1, sha224, sha256, sha384, sha512.

 

logging模組

import logging

logging.debug("debug")
logging.info("info")
logging.warning("warning")
logging.error("error")
logging.critical("critical")

 

有五種日誌記錄方式,按等級依次是從低到高,輸出方式是輸出到螢幕

可是直接執行輸出到螢幕的只有

WARNING:root:warning
ERROR:root:error
CRITICAL:root:critical

原因是日誌輸出等級有限制,那麼怎麼改變等級的限制呢

logging.basicConfig(level=logging.DEBUG,
                format=`%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s`,
                datefmt=`%a, %d %b %Y %H:%M:%S`,
                # filename=`myapp.log`,
                # filemode=`w`
                    )

這裡通過上面的方法,level設定等級,format是輸出格式化方式,datefmt為日期的輸出格式,在新增了上述程式碼後再次執行螢幕會顯示

Thu, 20 Sep 2018 19:33:50 模組.py[line:74] DEBUG debug
Thu, 20 Sep 2018 19:33:50 模組.py[line:75] INFO info
Thu, 20 Sep 2018 19:33:50 模組.py[line:76] WARNING warning
Thu, 20 Sep 2018 19:33:50 模組.py[line:77] ERROR error
Thu, 20 Sep 2018 19:33:50 模組.py[line:78] CRITICAL critical

這樣就都能夠顯示了,那logging.basicConfig中filename和filemode是做什麼的呢

當把上述註釋了的兩行恢復,那麼這些日誌就只會以檔案的方式儲存,不會再在螢幕中列印filename為儲存的檔名,filemode為儲存方式

接下來問題就來了,如果我既想在螢幕輸出,又想在檔案中儲存怎麼辦?

第二個問題,如果我想根據不同的情況,類別,把日誌分別儲存怎麼辦?

import logging

logger = logging.getLogger(log_type)
logger.setLevel(log_LEVEL)

ch = logging.StreamHandler()
ch = setLevel(log_LEVEL)

fh = logging.FileHandler(log_file)
fh.setLevel(log_LEVEL)

formatter = logging.Formatter(`輸出格式`)

ch.setFormatter(formatter)
fh.setFormatter(formatter)

logger.addHandler(ch)
logger.addHandler(fh)

logger.info("日誌資訊")

利用這種方式可通過getLogger建立不同的物件來管理不同的日誌,同時可以根據情況來設定輸出到螢幕,還是儲存到檔案,還是兩者都是。

 

configparser模組

configparser是python用來處理配置檔案的模組

首先可以使用它生成一個配置檔案

 

import configparser
config=configparser.ConfigParser()
config["DEFAULT"]={"ServerAliveInterval" : 45,
                    "Compression" :"yes",
                    "CompressionLevel" : 9,
                    "ForwardX11" : "yes"}
config["bitbucket.org"]={"User" : "Tom"}
config["topsecret.com"]={"Port": 50022,
                    "ForwardX11": "no"}


with open ("example.ini","w") as configfile:
    config.write(configfile)

 

這裡也可以直接使用config.read_dict(字典)來讀取內容,最後生成的配置檔案為

[DEFAULT]
serveraliveinterval = 45
compression = yes
compressionlevel = 9
forwardx11 = yes

[bitbucket.org]
user = Tom

[topsecret.com]
port = 50022
forwardx11 = no

接下來我們對這個配置檔案進行一些增刪改查的操作

config.read("example.ini")
print(config.sections())#[`bitbucket.org`, `topsecret.com`]

這裡不會顯示DEFAULT,因為它是一個特殊項

print(config.defaults())
#OrderedDict([(`serveraliveinterval`, `45`), (`compression`, `yes`), (`compressionlevel`, `9`), (`forwardx11`, `yes`)])

可以通過上述方式檢視default中的內容

具體內容可以通過檢視字典的方式來檢視

print(config["bitbucket.org"]["user"])#Tom
print(config["DEFAULT"]["compression"])#yes

然後還有一種特殊的情況

for i in config["bitbucket.org"]:
    print(i)

一般人會認為這裡輸出的是bitbucket.org中的鍵,但其實輸出的是

user
serveraliveinterval
compression
compressionlevel
forwardx11

這裡還會再將DEFAULT中的鍵輸出

刪除操作

刪除鍵值對

config.remove_option("bitbucket.org","user")
config.write(open ("example.ini","w"))

刪除塊section

config.remove_section("topsecret.com")
config.write(open ("example.ini","w"))

判斷是否存在

print(config.has_section("bitbucket.org"))

修改

config.set("bitbucket.org","user","Jerry")
config.write(open ("example.ini","w"))

這些有改變的操作要注意最後再寫入檔案config.write(open (“example.ini”,”w”))

 

相關文章