1. 程式人生 > >Python之旅.第四章.模塊與包.總結(未完待遇)

Python之旅.第四章.模塊與包.總結(未完待遇)

standard 後綴 att 擔心 lse 綁定 做的 業務 搜索

一、模塊

模塊:

一系列功能的集合體,在python中一個py文件就是一個模塊,模塊名就是py文件的文件名;

模塊的好處:

1.減少重復的代碼

2.拿來主義

定義模塊:

就是創建一個py文件;

使用模塊:

關鍵字:import

用法:import 模塊名(不要加py後綴)

註意區分執行文件和模塊文件,執行文件是你當前邏輯程序,模塊文件是你用來調用功能的文件;

首次導入模塊:

1.創建一個模塊的名稱空間

2.執行模塊文件,將模塊文件產生的名字存放於創建的模塊名稱空間

3.當執行文件中拿到一個模塊名,該模塊名指向模塊名稱空間中的模塊名

強調:當第一次導入模塊名,就會把模塊內容導入到內存空間,在同一文件再次導用模塊名時調用的就是第一次導入內存空間內的模塊文件,不會從新導入模塊文件;

調用模塊內的功能:

用模塊名.功能名()

註意:

模塊中功能的執行始終以模塊自己的名稱空間為準;

也就是調用的模塊功能用的都是該模塊內的值,修改的也是該模塊內的值,並不影響當前執行文件;

為模塊起別名:

關鍵字as

定義:

import 模塊名 as 想定義的模塊名;

用處:

1.模塊名太長,把模塊名定義短一點,減少繁瑣

2.比如有兩個模塊,兩個模塊有相同的功能名,但其中的功能效果不同,這時候就可以把兩個模塊名都改成相同的模塊名,

用一個輸入加判斷,來確定你要導入的是哪個功能,你輸入的是哪個模塊名,就是哪個模塊內功能的效果,模塊名(修改過)和功能名未變,

,使用的是什麽功能取決於你輸入的模塊名,其他的代碼都無需改動,以後修改只需要,多添加一個判斷模塊名就可以了;

導入多個模塊(不推薦)

import 模塊名1,模塊名2,模塊名3

推薦還是多行導入

第二種導入方式:

關鍵字 from

from 模塊名 import 功能名1,功能名2,功能名3

首次導入:

1.創建一個模塊的名稱空間

2.執行模塊文件,將模塊文件產生的名字存放於創建的模塊名稱空間

3.在當前名稱空間中可以直接拿到模塊中的名字,可以直接使用,不用加任何前綴

註意:這種情況,因為沒有模塊名.功能名,如果在當前執行文件中有與模塊名內功能相同的名字,就會執行當前文件內的功能名(變量名),

所以要註意,不能取與模塊功能相同的名稱;

多個調用:

關鍵字:*

from 模塊名 import *

*代替所有能調用的功能的名字;

註意:因為有些功能常用,有些功能不常用,模塊的設計者,一般都會控制*所能調用的模塊名;

關鍵字:__all__=[]

__all__=[功能名1,功能名2....]

限制以後,*所能調用的就只能是all以內的功能名;

測試模塊功能:

關鍵字:__name__

__name__的值

1.在文件被直接執行的情況下等於__main__

2.在文件被導入的情況下等於模塊名

也就是可以用__name__來判斷,是否是直接執行測試功能,還是導入

if __name__ == ‘__main__‘:
  #代碼塊
print(‘再代碼塊中輸入你所要測試的功能‘)

模塊的搜索路徑

sys.path:當前執行文件所在的文件夾;只看第一個路徑;

可以用print(sys.path)在終端輸出路徑,第一個就是當前執行文件所在的文件夾

模塊的查找順序:

1.內存空間

2.內置空間

3.sys.path路徑

sys.modules:當前內存中已經被導入的模塊

print(sys.modules) :在終端輸出內存中所有被導入的模塊

在sys.path中添加路徑

sys.path.append(需要添加的路徑)

比如你把模塊文件放在了別的文件夾,sys.path只是當前文件夾,這時候用append把放模塊的文件夾的路徑加到sys.path中,

這樣就能在sys.path找到模塊所在的文件夾,就可以調用模塊

軟件開發目錄規範

路徑:用常量名,後面賦予路徑

常量路徑名=r‘路徑‘

常用目錄:(當前水平用這個目錄足夠了)

ATM:文件夾,所需要做的項目名,用於存放項目相關所有文件和文件夾

readme:文件,用於介紹程序功能

bin:文件夾,只放啟動文件

start:文件,啟動文件

conf:文件夾,用於存放配置文件

settings:文件名,配置文件

core:文件夾,存放核心邏輯

src:文件名,業務核心邏輯文件

db:文件夾,用於存放數據文件

db:文件名,用於存放數據

lib:文件夾,用於存放常用工具,也就是模塊文件

common:文件名,常用功能文件,也就是常用模塊文件

log:文件夾,用於存放文件日誌

access.log:文件名,日誌文件

應該把項目的根目錄添加到環境變量中;

就比如上方的ATM項目:

根目錄就是ATM目錄,以後需要調用什麽功能,在根目錄下都可以查找到

取目錄:

os.path.dirname(__file__) :取當前文件所在的目錄

os.path.dirname(os.path.dirname(__file__) ) :取當前所在在文件目錄的上一級目錄

以此類推,取第幾層就寫幾段,後面有跟方便的方法,此方法僅供參考

然後把你需要的路徑,賦值到一個常量當中,當以後有需要調用的時候,直接調用常量名

不必輸入固定目錄,以限制程序

比如,sys.path.append(os.path.dirname(__file__) ):直接加入當前路徑

第二種方法:推薦

os.path.normpath(os.path.join(

     __file__,
    ‘..‘,
     ‘..‘
    ))

logging模塊

debug:代表調試信息,級別10

info:代表正常運行信息,級別20

warning:代表警告信息,級別30

errot:代表錯誤信息,級別40

critical:代表崩潰信息,級別50

設置成什麽級別,打印什麽級別信息

logging模塊模板

"""
logging配置
"""

#定義日誌文件路徑
#把日誌路徑賦予一個變量
LOG_PATH=r‘a3.log‘

# 定義三種日誌輸出格式 開始
#把自己定義的個數賦予一個變量用於後面的調用
standard_format = ‘[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]‘ \
‘[%(levelname)s][%(message)s]‘ #其中name為getlogger指定的名字

simple_format = ‘[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s‘

id_simple_format = ‘[%(levelname)s][%(asctime)s] %(message)s‘


# log配置字典
LOGGING_DIC = {
‘version‘: 1,
‘disable_existing_loggers‘: False,
#多個日誌格式,不可更改
‘formatters‘: {
#日誌格式名,可更改,這名字的意思是往終端打
‘standard‘: {
#日誌格式:上方定義的格式的變量名
‘format‘: standard_format
},
#這個名字的意思是往文件打
‘simple‘: {
‘format‘: simple_format
},
},
#過濾,沒什麽用,可以無視
‘filters‘: {},
#定義日誌輸出的格式:文件或終端,不可更改
‘handlers‘: {
#打印到終端的日誌名,可以更改
‘console‘: {
#定義日誌級別,不可更改:日誌級別,可更改為DEBUG/INFO/WARNING/ERROT/CRITICAL
‘level‘: ‘DEBUG‘,
#定義日誌輸出格式,不可更改
‘class‘: ‘logging.StreamHandler‘, # 打印到屏幕
#綁定格式,不可更改:具體格式根據上方定義的格式更改
‘formatter‘: ‘simple‘
},
#打印到文件的日誌,收集info及以上的日誌
‘default‘: {
‘level‘: ‘DEBUG‘,
‘class‘: ‘logging.handlers.RotatingFileHandler‘, # 保存到文件
‘formatter‘: ‘standard‘,
#日誌寫到哪個文件:變量名,此變量我們在上面以賦予路徑
‘filename‘: LOG_PATH, # 日誌文件
#規定日誌切分大小,以字節為單位
‘maxBytes‘: 1024*1024*5, # 日誌大小 5M
#規定日誌切分後保存的日誌次數
‘backupCount‘: 5,
#日誌文件編碼
‘encoding‘: ‘utf-8‘, # 日誌文件的編碼,再也不用擔心中文log亂碼了
},
},
#產生日誌,並且傳的名字,名字空為默認
‘loggers‘: {
#logging.getLogger(__name__)拿到的logger配置
‘‘: {
#把日誌丟給誰,列表內存放的上上方定義的日誌名
‘handlers‘: [‘default‘, ‘console‘], # 這裏把上面定義的兩個handler都加上,即log數據既寫入文件又打印到屏幕
#設置級別,兩層關卡,與上方級別相同即可
‘level‘: ‘DEBUG‘,
#向父級傳遞,通常關閉就可以了
‘propagate‘: False, # 向上(更高level的logger)傳遞
},
},
}

import logging
import logging.config

#加載上方定義的字典
def get_logger(name):
#讓logging模塊從字典裏加載配置
logging.config.dictConfig(LOGGING_DIC) # 導入上面定義的logging配置
#拿到logging名,因為上面logging名為空,所以這裏用__name__,如果上方定義了實名,就用上方定義的實名
logger = logging.getLogger(name) # 生成一個log實例
return logger # 記錄該文件的運行狀態
#用來測試是否在當前文件執行
if __name__ == ‘__main__‘:
get_logger()

什麽是序列化:

我們把對象(變量)從內存中變成可儲存或可傳輸的過程叫做序列化;

為什麽要有序列化:

1.持久保存狀態

2.跨平臺數據交互

json模塊

json只能處理字典,列表,字符串,數字,bool,空類型

json內都是雙引號

序列化:內存中的數據結構——轉成一種中間格式(字符串)——存儲到文件中

關鍵字:json.dump()

用法:json.dump(需要序列化的值,打開文件的變量名)

反序列化:文件——讀取中間格式(字符串)——轉成內存中的數據結構

只用W寫模式

關鍵字:json.load

用法:json.load(打開文件的變量名)

pickle模塊

pickle可以轉換所有的類型,但只能在python中使用

序列化:內存中的數據結構——轉成一種中間格式(字符串)——存儲到文件中

關鍵字:pickle.dump()

用法:pickle.dump(需要序列化的值,打開文件的變量名)

反序列化:文件——讀取中間格式(字符串)——轉成內存中的數據結構

只用W寫模式

關鍵字:pickle.load

用法:pickle.load(打開文件的變量名)

os模塊

os.path.abspath(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.getsize(path)統計文件大小,單位為字節

os.path.join(‘a‘,‘b‘,‘c.txt‘) 將多個路徑組合後返回,第一個絕對路徑之前的參數將被忽略

不用寫路徑符

os.path.normpath(path) 規範化路徑,把裏面的斜杠同一,..(..返回上一層符號)執行等

用於取需要的絕對路徑:

Python之旅.第四章.模塊與包.總結(未完待遇)