包、模塊二
一、包
1.什麽是包:
包就是一個包含有__init__.py文件的文件夾
2.為何要用包:
為了用文件夾講文件/模塊組織起來,提高程序的結構性和可維護性
3.包的使用
實例一:
創建文件夾aaa,在aaa文件夾內創建__init__.py 和 m1.py文件,在aaa同級目錄下創建一個執行文件run,py文件
#m1文件的內容:
def f1():
print(‘fff111‘)
def f2():
print(‘fff222‘)
在__init__.py添加內容,在aaa中拿到名字m1,m2:
from aaa.m1 import f1,f2
執行文件run.py:
import aaa
aaa.f1()
aaa.f2()
以上執行結果為:fff111 fff222
總結:
import導入文件時,產生名稱空間中的名字來源於文件,import 包,
產生的名稱空間的名字同樣來源於文件,即包下的__init__.py,導入包本質就是在導入該文件__init__.py
另外:
包A和包B下有同名模塊也不會沖突,如A.a與B.a來自倆個命名空間
實例二:
在aaa文件夾內創建bbb文件夾,在bbb文件夾中創建m3.py文件。bbb和前面創建的m1.py、m2.py同級
#m3文件的內容:
def f3():
print(‘fff333‘)
若想在run中調用m3中的f3:
要在__init__.py添加內容,在aaa中拿到名字m3:
from aaa.bbb.m3 import f3
執行文件run.py:
import aaa
aaa.f3()
執行結果即為:fff333
4.相對導入:
以上包內模塊的絕對導入
from aaa.m1 import f1,f2
from aaa.bbb.m3 import f3
優點: 執行文件與被導入的模塊中都可以使用
缺點: 所有導入都是以sys.path為起始點,導入麻煩
另外我們可以采用相對導入
一個.代表往上一級
__init__.py中的內容可以寫成:
from .m1 import f1,f2
from ..m3 import f3
m1的上一級是aaa,所以.m1代表了aaa.
m3的上一級是bbb,再上一級是aaa,我們需要在aaa中拿到m3的名字,就要往上返兩級,因此..m3表示aaa.bbb.m3
優點:導入更加簡單
缺點: 只能在導入包中的模塊時才能使用
強調:
包以及包所包含的模塊都是用來被導入的,而不是被直接執行的。而環境變量都是以執行文件為準的
二、json & pickle
1.什麽是序列化:
序列化就是將數據類型轉成另外一種格式
序列化:
字典---》其他格式---》硬盤
反序列化:
硬盤---》讀取---》其他格式---》反序列化---》字典
2.為何要用序列化:
2.1 持久保存程序的運行狀態
2.2 數據的跨平臺交互
3.如何序列化
3.1 json
優點:這種格式是一種通用的格式,所有編程語言都能識別,跨平臺性很強
缺點:不能識別所有python類型
強調:
json不能識別單引號
3.2 pickle
優點:可以識別所有python類型
缺點:只能被python這門編程語言識別
json的使用:
import json
序列化
dic_json=json.dumps(dic)
print(dic_json)
持久化
with open(‘a.json‘,‘wt‘,encoding=‘utf8‘)as f:
f.write(dic_json)
序列化+持久化
with open(‘a.json‘,mode=‘wt‘,encoding=‘utf-8‘) as f:
json.dump(dic,f)
從文件中讀取json格式化的字符
with open(‘a.json‘,‘rt‘,encoding=‘utf8‘)as f:
dic_json=f.read()
反序列化
dic = json.loads(dic_json)
print(dic,dic[‘k1‘])
讀取文件內容+反序列化
with open (‘a.json‘,‘rt‘,encoding=‘utf8‘)as f:
dic = json.load(f)
print(dic,dic[‘k1‘])
pickle的使用:
import pickle
dic = {‘k1‘:True,‘k2‘:10,‘k3‘:‘egon‘,‘k4‘:‘你好啊‘}
序列化:
dic_pkl = pickle.dumps({1,2,3,4})
print(dic_pkl)
持久化
with open(‘b.pkl‘,‘wb‘)as f:
f.write(dic_pkl)
序列化 + 持久化:
with open(‘c.pkl‘,‘wb‘)as f:
pickle.dump(dic,f)
從文件中讀取pickle格式化的字符 + 反序列化 :
with open(‘b.pkl‘,mode=‘rb‘)as f:
s_pkl = f.read()
s = pickle.loads(s_pkl)
print(type(s))
從文件中讀取pickle格式化的字符 + 反序列化
with open(‘c.pkl‘,‘rb‘)as f:
dic = pickle.load(f)
print(dic,type(dic))
三、time
import time
時間分為三種格式:
1. 時間戳
time.time()
2. 格式化的字符
print(time.strftime(‘%Y-%m-%d %H:%M:%S %p‘))
3. 結構化的時間對象
當地時間:
print(time.localtime())
當天第幾個小時:
print(time.localtime().tm_hour)
當天為本月第幾周:
print(time.localtime().tm_wday)
當天為今年第幾天:
print(time.localtime().tm_yday)
標準時間:
print(time.gmtime())
4.時間轉換
時間戳---->struct_time------->格式化的字符串
struct_time=time.localtime(123123)
print(struct_time)
print(time.strftime(‘%Y-%m-%d‘,struct_time))
格式化的字符串---->struct_time------->時間戳
struct_time=time.strptime(‘2017-03-11‘,‘%Y-%m-%d‘)
print(struct_time)
四、datetime模塊
時間加減
import datetime
print(datetime.datetime.now()) #返回 2016-08-19 12:47:03.941925
print(datetime.date.fromtimestamp(time.time()) ) # 時間戳直接轉成日期格式 2016-08-19
print(datetime.datetime.now() )
print(datetime.datetime.now() + datetime.timedelta(3)) #當前時間+3天
print(datetime.datetime.now() + datetime.timedelta(-3)) #當前時間-3天
print(datetime.datetime.now() + datetime.timedelta(hours=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模塊
import random
print(random.random())#(0,1)----float 大於0且小於1之間的小數
print(random.randint(1,3)) #[1,3] 大於等於1且小於等於3之間的整數
print(random.randrange(1,3)) #[1,3) 大於等於1且小於3之間的整數
print(random.choice([1,‘23‘,[4,5]]))#1或者23或者[4,5]
print(random.sample([1,‘23‘,[4,5]],2))#列表元素任意2個組合
print(random.uniform(1,3))#大於1小於3的小數,如1.927109612082716
item=[1,3,5,7,9]
random.shuffle(item) #打亂item的順序,相當於"洗牌"
print(item)
生成隨機驗證碼:
import random
def make_code(n):
res = ‘ ‘
for i in range(n):
s1=chr(random.randint(65,90))
s2=str(random.randint(0,9))
res+=random.choice([s1,s2])
return res
print(make_code(5))
包、模塊二