5.1 存儲(chǔ)
5.1.1 文件
①打開
如果Python程序運(yùn)行結(jié)束,那么分配給這個(gè)程序的內(nèi)存空間也會(huì)清空奕谭。為了長期持續(xù)地存儲(chǔ)撵幽,Python必須把數(shù)據(jù)存儲(chǔ)在磁盤中斯稳。如果把數(shù)據(jù)儲(chǔ)存在磁盤中,即使斷電或程序結(jié)束庄萎,數(shù)據(jù)依然存在踪少。
在Python中,我們可以通過內(nèi)置函數(shù)open來創(chuàng)建文件對(duì)象糠涛。在調(diào)用open時(shí)援奢,需要說明文件名,以及打開文件的方式:
f=open(文件名忍捡,方式)
文件名是文件存在于磁盤的名字集漾,打開文件的常用方式有:
"r" # 讀取已經(jīng)存在的文件
?"w" # 新建文件,并寫入
?"a" # 如果文件存在砸脊,那么寫入到文件的結(jié)尾具篇。如果文件不存在,則新建文件并寫入
②修改
content = f.read(10)? ? ? ? # 讀取10個(gè)字節(jié)的數(shù)據(jù)?
content = f.readline()? ? ? # 讀取一行?
content = f.readlines()? ? ? # 讀取所有行凌埂,儲(chǔ)存在列表中驱显,每個(gè)元素是一行。
如果想寫入一行瞳抓,則需要在字符串末尾加上換行符埃疫。在UNIX系統(tǒng)中,換行符 為"\n"孩哑。在Windows系統(tǒng)中栓霜,換行符為"\r\n"。
完成后close
5.1.2 上下文管理器
上下文管理器可以在不需要文件的時(shí)候横蜒,自動(dòng)關(guān)閉文件胳蛮。
①一般語法
# 常規(guī)文件操作
f = open("new.txt", "w")?
print(f.closed) # 檢查文件是否打開?
f.write("Hello World!")?
f.close()?
?print(f.closed) # 打印True
②上下文管理器
# 使用上下文管理器?
with open("new.txt", "w") as f:?
? ? ? ? f.write("Hello World!")?
?print(f.closed)
任何定義了__enter__()方法和__exit__()方法的對(duì)象都可以用于上下文管理 器秤掌。下面,我們自定義一個(gè)類Vow鹰霍,并定義它的__enter__()方法和__exit__()方 法闻鉴。因此,由Vow類的對(duì)象可以用于上下文管理器:
class Vow(object):? ??
? ?def __init__(self, text):? ? ? ??
? ? ? ? self.text = text? ??
? ?def __enter__(self):? ? ? ??
? ? ? ? self.text = "I say: " + self.text? ? # 增加前綴? ? ? ??
? ? ? ? return self? ? ? ? ? ? ? ? ? ? ? ? ? # 返回一個(gè)對(duì)象? ??
? def __exit__(self,exc_type,exc_value,traceback):? ? ? ??
? ? ? ?self.text = self.text + "!"? ? ? ? ? #增加后綴? ??
? with Vow("I'm fine") as myVow:? ??
? ? ? ? print(myVow.text)? ??
print(myVow.text)
5.1.3 pickle 包
通過pickle包茂洒,我們可以把某個(gè)對(duì)象保存下來孟岛,再存成磁盤里的文 件。
實(shí)際上督勺,對(duì)象的存儲(chǔ)分為兩步渠羞。第一步,我們將對(duì)象在內(nèi)存中的數(shù)據(jù)直接抓取 出來智哀,轉(zhuǎn)換成一個(gè)有序的文本次询,即所謂的序列化。第二步瓷叫,將 文本存入文件屯吊。等到需要時(shí),我們從文件中讀出文本摹菠,再放入內(nèi)存盒卸,就可以獲得原 有的對(duì)象。下面是一個(gè)具體的例子次氨,
①首先是第一步序列化蔽介,將內(nèi)存中的對(duì)象轉(zhuǎn)換為文本流:
import pickle? ? ?
class Bird(object):
? ? ?have_feather = True? ? ?
? ? ?reproduction_method? = "egg"? ??
? ? ?summer? ? ? ? = Bird()? ? ? ? ? ? ? ? ?# 創(chuàng)建對(duì)象
? ? ?pickle_string = pickle.dumps(summer)? ?# 序列化對(duì)象
使用pickle包的dumps()方法可以將對(duì)象轉(zhuǎn)換成字符串的形式。隨后我們用字節(jié)文本的存儲(chǔ)方法煮寡,將該字符串儲(chǔ)存在文件虹蓄。繼續(xù)第二步:
with open("summer.pkl", "wb") as f:?
? ? ? ?f.write(pickle_string)
我們可以使用 dump()的方法,一次完成兩步:
import pickle
class Bird(object):?
? ? have_feather = True?
? ? reproduction_method = "egg"?
?summer = Bird()?
?with open("summer.pkl", "w") as f:?
? ? ?pickle.dump(summer, f) # 序列化并保存對(duì)象
5.2? 一寸光陰
5.2.1? time包
標(biāo)準(zhǔn)庫的time包提供了基本的時(shí)間 功能幸撕。下面使用time包:
①clock
import time start = time.clock()?
for i in range(100000):
? ? print(i**2)? ??
end = time.clock()?
print(end - start)
②sleep
方法sleep()可以讓程序休眠薇组。根據(jù)sleep()接收到的參數(shù),程序會(huì)在某時(shí)間間 隔之后醒來繼續(xù)運(yùn)行:
import time?
print("start")?
time.sleep(10) # 休眠10秒?
print("wake up")
time包還定義了struct_time對(duì)象杈帐。該對(duì)象將掛鐘時(shí)間轉(zhuǎn)換為年体箕、月、日挑童、 時(shí)累铅、分、秒等站叼,存儲(chǔ)在該對(duì)象的各個(gè)屬性中娃兽,比如tm_year、tm_mon尽楔、tm_mday…… 下面幾種方法可以將掛鐘時(shí)間轉(zhuǎn)換為struct_time對(duì)象:
st = time.gmtime() #返回struct_time格式的UTC時(shí)間?
st = time.localtime() #返回struct_time格式的當(dāng)?shù)貢r(shí)間投储,當(dāng)?shù)貢r(shí)區(qū)根據(jù)系 #統(tǒng)環(huán)境決定
我們也可以反過來第练,把一個(gè)struct_time對(duì)象轉(zhuǎn)換為time對(duì)象:
s = time.mktime(st) # 將struct_time格式轉(zhuǎn)換成掛鐘時(shí)間