5.1 存儲
5.1.1 文件
①打開
如果Python程序運行結束,那么分配給這個程序的內存空間也會清空。為了長期持續地存儲,Python必須把數據存儲在磁盤中。如果把數據儲存在磁盤中,即使斷電或程序結束,數據依然存在。
在Python中,我們可以通過內置函數open來創建文件對象。在調用open時,需要說明文件名,以及打開文件的方式:
f=open(文件名,方式)
文件名是文件存在于磁盤的名字,打開文件的常用方式有:
"r" # 讀取已經存在的文件
?"w" # 新建文件,并寫入
?"a" # 如果文件存在,那么寫入到文件的結尾。如果文件不存在,則新建文件并寫入
②修改
content = f.read(10)? ? ? ? # 讀取10個字節的數據?
content = f.readline()? ? ? # 讀取一行?
content = f.readlines()? ? ? # 讀取所有行,儲存在列表中,每個元素是一行。
如果想寫入一行,則需要在字符串末尾加上換行符。在UNIX系統中,換行符 為"\n"。在Windows系統中,換行符為"\r\n"。
完成后close
5.1.2 上下文管理器
上下文管理器可以在不需要文件的時候,自動關閉文件。
①一般語法
# 常規文件操作
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__()方法的對象都可以用于上下文管理 器。下面,我們自定義一個類Vow,并定義它的__enter__()方法和__exit__()方 法。因此,由Vow類的對象可以用于上下文管理器:
class Vow(object):? ??
? ?def __init__(self, text):? ? ? ??
? ? ? ? self.text = text? ??
? ?def __enter__(self):? ? ? ??
? ? ? ? self.text = "I say: " + self.text? ? # 增加前綴? ? ? ??
? ? ? ? return self? ? ? ? ? ? ? ? ? ? ? ? ? # 返回一個對象? ??
? 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包,我們可以把某個對象保存下來,再存成磁盤里的文 件。
實際上,對象的存儲分為兩步。第一步,我們將對象在內存中的數據直接抓取 出來,轉換成一個有序的文本,即所謂的序列化。第二步,將 文本存入文件。等到需要時,我們從文件中讀出文本,再放入內存,就可以獲得原 有的對象。下面是一個具體的例子,
①首先是第一步序列化,將內存中的對象轉換為文本流:
import pickle? ? ?
class Bird(object):
? ? ?have_feather = True? ? ?
? ? ?reproduction_method? = "egg"? ??
? ? ?summer? ? ? ? = Bird()? ? ? ? ? ? ? ? ?# 創建對象
? ? ?pickle_string = pickle.dumps(summer)? ?# 序列化對象
使用pickle包的dumps()方法可以將對象轉換成字符串的形式。隨后我們用字節文本的存儲方法,將該字符串儲存在文件。繼續第二步:
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) # 序列化并保存對象
5.2? 一寸光陰
5.2.1? time包
標準庫的time包提供了基本的時間 功能。下面使用time包:
①clock
import time start = time.clock()?
for i in range(100000):
? ? print(i**2)? ??
end = time.clock()?
print(end - start)
②sleep
方法sleep()可以讓程序休眠。根據sleep()接收到的參數,程序會在某時間間 隔之后醒來繼續運行:
import time?
print("start")?
time.sleep(10) # 休眠10秒?
print("wake up")
time包還定義了struct_time對象。該對象將掛鐘時間轉換為年、月、日、 時、分、秒等,存儲在該對象的各個屬性中,比如tm_year、tm_mon、tm_mday…… 下面幾種方法可以將掛鐘時間轉換為struct_time對象:
st = time.gmtime() #返回struct_time格式的UTC時間?
st = time.localtime() #返回struct_time格式的當地時間,當地時區根據系 #統環境決定
我們也可以反過來,把一個struct_time對象轉換為time對象:
s = time.mktime(st) # 將struct_time格式轉換成掛鐘時間