前言
文件的讀寫操作是一門編程開發(fā)語言的基礎(chǔ),Python內(nèi)置了讀寫文件的函數(shù),用法和C是兼容的。
我們先解釋一下文件讀寫的本質(zhì),在Linux中,分為普通文件和特殊文件,其中特殊文件是指操作系統(tǒng)將所有設(shè)備都作為文件來處理。
我們這里處理的是普通文件,它是一組數(shù)據(jù)集合,存放在磁盤上。讀操作也就是將磁盤中的內(nèi)容讀到內(nèi)存中進(jìn)行處理,寫操作也就是將內(nèi)存中的數(shù)據(jù)持久化到磁盤上。
文件操作
文件類型
- 文本文件 - 這類文件以文本的ASCII碼形式存儲在計算機(jī)中。它是以"行"為基本結(jié)構(gòu)的一種信息組織和存儲方式。
- 二進(jìn)制文件 - 這類文件以文本的二進(jìn)制形式存儲在計算機(jī)中,用戶一般不能直接讀懂它們,只有通過相應(yīng)的軟件才能將其顯示出來。二進(jìn)制文件一般是可執(zhí)行程序、圖形、圖像、聲音等等。
字符編碼
對于文本來說,字符編碼比較重要,在Python中也經(jīng)常會出現(xiàn)字符編碼的異常問題,我們需要進(jìn)行各種轉(zhuǎn)換如encode和decode操作。以下幾個概念必須熟記于心:
- 在Python2x中默認(rèn)字符編碼是ASCII, 而在Python3里默認(rèn)是utf8
- unicode 分為 utf-32(占4個字節(jié)),utf-16(占兩個字節(jié)),utf8(占1-4個字節(jié))
- 在Pyhton3中encode,在編碼的同時還會把string 變成bytes類型,decode在解碼的同時還會把bytes變回string
- unicode是離用戶更近,bytes是離計算機(jī)更近
文件操作
一般來說,操作一個文件,會用到open, write, read, close等幾個函數(shù),由于文件讀寫時都有可能產(chǎn)生IOError,一旦出錯,后面的f.close()就不會調(diào)用。
所以,為了保證無論是否出錯都能正確地關(guān)閉文件,我們可以使用try ... finally來實現(xiàn),但是每次都這么寫實在太繁瑣。
所以,Python引入了with語句來自動幫我們調(diào)用close()方法:
來看一個例子:
fpath = r'./test.txt'
with open(fpath, 'w') as f:
f.write('Hello, world!')
with open(fpath, 'r') as f:
s = f.read()
print(s)
輸出:
Hello, world!
通過with操作可以極大的簡化文件操作,這和try ... finally是一樣的,但是代碼更佳簡潔,并且不必調(diào)用f.close()方法。
目錄操作
通常文件都會以目錄為單元進(jìn)行組織,如果我們要操作文件、目錄,可以通過
#創(chuàng)建目錄
os.mkdir('test')
#刪除目錄
os.rmdir('test')
#修改目錄名
os.rename('test1', 'test2')
#遍歷當(dāng)前目錄
os.listdir('.')
序列化與反序列化
什么是序列化與反序列化:
序列化Serialization將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或傳輸?shù)男问降倪^程。在序列化期間,對象將其當(dāng)前狀態(tài)寫入到臨時或持久性存儲區(qū)。以后,可以通過從存儲區(qū)中讀取或反序列化對象的狀態(tài),重新創(chuàng)建該對象。
序列化的作用
序列化之后,就可以把序列化后的內(nèi)容寫入磁盤,或者通過網(wǎng)絡(luò)傳輸?shù)絼e的機(jī)器上。
pickle與cpickle
pickle是python標(biāo)準(zhǔn)庫中提供序列化的功能模塊,可以將內(nèi)存對象非常方便的進(jìn)行持久化操作。其中cpickle的速度更快,我們將在后面的章節(jié)中進(jìn)行介紹。
import pickle
d = {"name": "xiaoT", "age":18}
#序列化到文件
f = open('dump.dat', 'wb')
pickle.dump(d, f)
f.close()
#反序列化到內(nèi)存
f = open('dump.dat', 'rb')
d = pickle.load(f)
f.close()
print(d)
輸出:
{'name': 'xiaoT', 'age': 18}
小結(jié)
在Python中,文件讀寫是通過open()函數(shù)打開的文件對象完成的。使用with語句操作文件IO是個好習(xí)慣。
原文地址