0.日常吐槽
小更一下,內(nèi)容不多,其實(shí)完全是因?yàn)榭凑撐目吹綉岩扇松?,想隨便寫(xiě)點(diǎn)東西發(fā)泄一下。
我為什么要上學(xué)。。。

1.文件的基本操作
用Python打開(kāi)一個(gè)文件只需用open(file,[mode=r])函數(shù),第一個(gè)參數(shù)是文件的位置,第二個(gè)參數(shù)是打開(kāi)模式,默認(rèn)為r只讀模式。常用的模式如下:
| 打開(kāi)模式 | 執(zhí)行操作 |
|---|---|
| 'r' | 以只讀方式打開(kāi)文件(默認(rèn)) |
| 'w' | 以寫(xiě)入的方式打開(kāi)文件,會(huì)覆蓋已存在的文件 |
| 'x' | 如果文件已經(jīng)存在,使用此模式打開(kāi)將引發(fā)異常 |
| 'a' | 以寫(xiě)入模式打開(kāi),如果文件存在,則在末尾追加寫(xiě)入 |
| 'b' | 以二進(jìn)制模式打開(kāi)文件 |
| 't' | 以文本模式打開(kāi)(默認(rèn)) |
| '+' | 可讀寫(xiě)模式(可添加到其他模式中使用) |
| 'U' | 通用換行符支持 |
舉個(gè)例子:
>>> f = open('E:\\test.txt','r')
>>> f
<_io.TextIOWrapper name='E:\\test.txt' mode='r' encoding='cp936'>
打開(kāi)文件之后,可以對(duì)文件進(jìn)行一些列操作。常見(jiàn)的操作如下表:
| 文件對(duì)象方法 | 執(zhí)行操作 |
|---|---|
| f.close() | 關(guān)閉文件 |
| f.read([size=-1]) | 從文件讀取size個(gè)字符,當(dāng)未給定size或給定負(fù)值的時(shí)候,讀取剩余的所有字符,然后作為字符串返回 |
| f.readline([size=-1]) | 從文件中讀取并返回一行(包括行結(jié)束符),如果有size有定義則返回size個(gè)字符 |
| f.write(str) | 將字符串str寫(xiě)入文件 |
| f.writelines(seq) | 向文件寫(xiě)入字符串序列seq,seq應(yīng)該是一個(gè)返回字符串的可迭代對(duì)象 |
| f.seek(offset, from) | 在文件中移動(dòng)文件指針,從from(0代表文件起始位置,1代表當(dāng)前位置,2代表文件末尾)偏移offset個(gè)字節(jié) |
| f.tell() | 返回當(dāng)前在文件中的位置 |
| f.truncate([size=file.tell()]) | 截取文件到size個(gè)字節(jié),默認(rèn)是截取到文件指針當(dāng)前位置 |
有幾個(gè)需要注意的地方:
- 操作完成后要記得利用
f.close()關(guān)閉文件。雖然Python有回收機(jī)制,即使忘記關(guān)閉也不會(huì)有什么太嚴(yán)重的后果,但這是一個(gè)良好的習(xí)慣。 -
mode=r的只讀模式下,無(wú)法對(duì)文件進(jìn)行修改,但可以讀取文件里的數(shù)據(jù)。而mode=w or a可以對(duì)文件就行修改,但若試圖用f.read讀取文件會(huì)報(bào)錯(cuò),提示not readable。 -
mode=w和mode=a的區(qū)別是如果文件已存在w會(huì)覆蓋原文件,并在創(chuàng)建的新文件里進(jìn)行寫(xiě)入;而a會(huì)在原文件后繼續(xù)寫(xiě)入。文件不存在時(shí)兩者都會(huì)創(chuàng)建一個(gè)新文件。
Example 1:
>>> f = open('E:\\test.txt')
>>> f.read()
'輕輕的我走了,\n正如我輕輕的來(lái);\n我輕輕的招手,\n作別西天的云彩。'
>>> f.read()
''
f.read()沒(méi)有參數(shù)時(shí),會(huì)返回所有剩余字符。再次read時(shí),因?yàn)橹羔樢呀?jīng)在最后,所以輸出了一個(gè)空字符。若要讓指針歸零,可以使用f.seek()函數(shù)。
>>> f.seek(0,0)
0
>>> f.read(10)
'輕輕的我走了,\n正如'
>>> f.close()
Example 2:
>>> f = open(r'e:\test.txt')
>>> f.readline()
'輕輕的我走了,\n'
>>> f.readline()
'正如我輕輕的來(lái);\n'
利用f.readline()逐行讀取,同樣光標(biāo)會(huì)逐漸向后移動(dòng)。同樣文件可以直接用在for循環(huán)中,循環(huán)時(shí)也是逐行讀取。
>>> f.seek(0,0)
0
>>> for eachline in f:
print(eachline)
輕輕的我走了,
正如我輕輕的來(lái);
我輕輕的招手,
作別西天的云彩。
循環(huán)也是從光標(biāo)處開(kāi)始的。例如:
>>> f.seek(10,0)
10
>>> for eachline in f:
print(eachline)
了,
正如我輕輕的來(lái);
我輕輕的招手,
作別西天的云彩。
10是字節(jié),一個(gè)漢字是兩個(gè)字節(jié),因此10個(gè)字節(jié)就是5個(gè)漢字。
Example 3:
>>> f = open(r'e:\test.txt', 'w')
>>> f.write('輕輕的我走了,\n正如我輕輕的來(lái);\n我輕輕的招手,\n作別西天的云彩。')
33
>>> f.close()
>>> f = open(r'e:\test.txt', 'r')
>>> f.read()
'輕輕的我走了,\n正如我輕輕的來(lái);\n我輕輕的招手,\n作別西天的云彩。'
>>> f.close()
這樣就寫(xiě)入了一個(gè)文件。
2.pickle(泡菜)模塊
不知道開(kāi)發(fā)者怎么想的,這么高大上的東西要起一個(gè)如此接地氣的名字...
之前寫(xiě)的內(nèi)容一直是用文本格式,在很多情況下我們需要保存或讀取諸如字典、列表等各式各樣的數(shù)據(jù),這時(shí)pickle模塊就十分實(shí)用。pickle是利用二進(jìn)制儲(chǔ)存和讀取數(shù)據(jù),說(shuō)起來(lái)就很簡(jiǎn)單,就是一個(gè)存儲(chǔ)一個(gè)讀取。使用之前要import pickle加載模塊。
2.1 存儲(chǔ)
存儲(chǔ)時(shí)以mode=wb打開(kāi)文件,然后利用pickle.dump(data,file)函數(shù)將數(shù)據(jù)寫(xiě)入文件即可。也是蠻形象的,將泡菜倒(dump)缸里腌制起來(lái)=.=。例如儲(chǔ)存一個(gè)列表:
>>> import pickle
>>> list1 = [1, 3.14, 'Python', int]
>>> f = open('test.pkl', 'wb')
>>> pickle.dump(list1, f)
>>> f.close()
這樣根目錄里就出現(xiàn)了一個(gè)test.pkl的文件。當(dāng)然文件類(lèi)型隨意了,我的.pkl也是隨便寫(xiě)的。
2.2 載入
載入時(shí)以mode=rb打開(kāi)文件,然后利用pickle.load(file)導(dǎo)入文件即可。我們將剛剛存儲(chǔ)的列表在讀取出來(lái)。
>>> f = open('list1','rb')
>>> list2 = pickle.load(f)
>>> print(list2)
[1, 3.14, 'Python', <class 'int'>]
>>> f.close()
這個(gè)模塊雖然簡(jiǎn)單,但卻非常實(shí)用。比如如果我們有巨大的數(shù)據(jù),就可以利用pickle泡菜技術(shù)將數(shù)據(jù)存到文件里,需要的時(shí)候在加載出來(lái),這樣可以大大簡(jiǎn)化代碼。
還有一個(gè)OS模塊對(duì)文件也是挺有用的,今天先不寫(xiě)了,等寫(xiě)完模塊或者什么時(shí)候想寫(xiě)了再學(xué)吧。繼續(xù)看論文了。
往期回顧
Python學(xué)習(xí)筆記(0)之Hello,python!
Python學(xué)習(xí)筆記(1)之列表list
Python學(xué)習(xí)筆記(2)之元組、字典&集合
Python學(xué)習(xí)筆記(3)之字符串string
Python學(xué)習(xí)筆記(4)之函數(shù)(一)
Python學(xué)習(xí)筆記(5)之函數(shù)(二)