文件介紹:文件其實(shí)沒什么好介紹的缅叠,我們?cè)谄綍r(shí)工作以及使用電腦的時(shí)候,都會(huì)用到各種各樣的文件臀脏,首先劝堪,文件有多種格式,比如.txt,.api,.jpg等等揉稚,都是用來存儲(chǔ)數(shù)據(jù)的幅聘,每種格式有每種格式的存取法則,如果一個(gè)文本文檔用jpg打開肯定是亂碼的窃植,因?yàn)橐?guī)則不一帝蒿;下面開始介紹python的文件操作
python文件操作就和我們平時(shí)用電腦操作文件一樣的,即打開文件巷怜,讀寫文件葛超,關(guān)閉文件;
打開文件:使用的是open()函數(shù)延塑,open函數(shù)有很多接收參數(shù)绣张,最重要的就是文件路徑和操作方式;
文件路徑:分為絕對(duì)路徑和相對(duì)路徑关带;絕對(duì)路徑就是完整的描述文件位置的路徑就是絕對(duì)路徑侥涵,相對(duì)路徑是是從當(dāng)前路徑開始的路徑;
操作方式分為5種:
r:以只讀的方式打開文件宋雏,讀取文件的指針在文件開頭芜飘,如果沒有這個(gè)文件,那么會(huì)報(bào)錯(cuò):如下面代碼磨总,那么file又是什么呢嗦明,file就是打開文件的時(shí)候獲取的一根管道,我們都是通過這跟管道進(jìn)行操作文件蚪燕;通過調(diào)用file的方法read()娶牌,就可以讀出文件的內(nèi)容了奔浅;這個(gè)是打開文件的默認(rèn)方式
file=open('ceshi.text','r')
content=file.read()
w:以只寫的方式打開文件,如果文件不存在會(huì)重新創(chuàng)建一個(gè)新文件诗良,寫的指針在文件的開頭汹桦,所以往里面寫的時(shí)候會(huì)覆蓋文件,
file=open('a.text','w')
file.write('e')
file.close()
a:和w模式差不多鉴裹,也是以只寫的方法打開文件营勤,唯一的區(qū)別就是a模式的指針在文件末尾,所以這種方式往里面寫就會(huì)追加在文件末尾壹罚;
file=open('a.text','a')
file.write('123')
file.close()
在講下一種操作模式之前葛作,我們應(yīng)該先搞清楚,什么是文本文件猖凛,什么是二進(jìn)制文件赂蠢,其實(shí)對(duì)于電腦而言,存放的都是二進(jìn)制數(shù)據(jù)辨泳,那為什么又有這兩種文件呢虱岂,他們的區(qū)別就是在于打開這個(gè)文件的程序?qū)τ诙M(jìn)制的解釋上,其實(shí)文本文件的解碼格式是確定的菠红,就是ASCII或者unicode編碼第岖,而音頻視頻這類文件當(dāng)然不能使用ASCLL這種方式去解碼,解出來的肯定是亂碼试溯,其實(shí)說白了就是你用什么編碼去存蔑滓,你就要用什么編碼去取,文本文件只是一種特殊的二進(jìn)制文件遇绞;也可以這樣說键袱,保存字符的文件就是文本文件,其他全是二進(jìn)制文件摹闽;
b模式:其實(shí)就是binary蹄咖,就是二進(jìn)制模式,比如我們要操作除了文本文件以外的文件付鹿,就用b模式澜汤,其實(shí)就在r,w的后面加一個(gè)b就行:下面的代碼是復(fù)制圖片的一半到另一個(gè)文件
readfile=open('image10.png','rb')
readcontent=readfile.read()
readfile.close()
writefile=open('write.png','wb')
writefile.write(readcontent[0:len(readcontent)//2])
writefile.close()
+模式:就是在前面所有的模式后面寫一個(gè)加號(hào),這種模式和沒寫加號(hào)的模式功能特點(diǎn)都差不多舵匾,也有細(xì)微差別這種模式代表既能讀俊抵,又可以寫,舉個(gè)例子:比如下面這種方式纽匙,我們打開了a.text,然后先讀出內(nèi)容务蝠,這個(gè)時(shí)候指針就到了最后一個(gè)拍谐,再往里面寫的時(shí)候烛缔,就成了追加馏段;
file=open('a.text','r+')
content=file.read()
print(content)
file.write('abcd')
file.close()
定位:就是指我們要讀取或者寫入的時(shí)候,指針的位置践瓷,我們可以從頭開始讀院喜,也可以從當(dāng)前的指針位置,也可以從文件末尾往前面讀晕翠;用的是seek()函數(shù)喷舀,另外tell()函數(shù)是告訴我們指針的位置;比如下面的代碼淋肾,seek()硫麻,第一個(gè)值是offset偏移量,第二個(gè)值是可選的相對(duì)哪個(gè)地方的偏移量樊卓,默認(rèn)是0就是文件開始拿愧,1是當(dāng)前指針,2是末尾指針碌尔;另外需要注意一點(diǎn)就是如果是文本文件的話浇辜,whence就只能是0,1和2只能是二進(jìn)制文件才可以唾戚;
file=open('a.text','rb')
print(file.tell())
file.seek(-4,2)
print(file.tell())
print(file.read())
print(file.tell())
file.close()
讀:就是讀取我們存的內(nèi)容柳洋;
1.使用read(),里面有一個(gè)可選參數(shù)叹坦,意思是需要讀取的字節(jié)數(shù)熊镣,默認(rèn)是文件內(nèi)容長度,下標(biāo)會(huì)自動(dòng)后移:
file=open('a.text','rb')
print(file.tell())
file.seek(-4,2)
print(file.tell())
print(file.read(2))
print(file.tell())
file.close()
2.使用readline()募书,里面也有一個(gè)可選參數(shù)轧钓,默認(rèn)就是一行的字節(jié)數(shù),意思是需要讀取的字節(jié)數(shù)锐膜,下標(biāo)也會(huì)自動(dòng)后移:注:換行占兩個(gè)字節(jié)
file=open('a.text','r')
print('=====',file.tell())
print(file.readline())
print('=====',file.tell())
print(file.readline())
print('=====',file.tell())
print(file.readline(2))
print('=====',file.tell())
3.使用readlines()毕箍,會(huì)自動(dòng)將文件按換行符進(jìn)行處理,返回的是每行組成的一個(gè)列表道盏;我們可以看到下面的結(jié)果就是一個(gè)列表而柑,里面的元素就是每一行的值包括換行符;
file=open('a.text','r')
print(file.readlines())
file.close()
結(jié)果:['123\n', '4\n', '56789']
4.遍歷,我們可以用for in 遍歷file本身帚豪,也可以遍歷通過readlines()返回的列表:首先我們看file是否可以遍歷瓦糕,是檢查file是否是iterrator,檢查出來結(jié)果是是迭代器涩澡,那么我們可以迭代,通過迭代結(jié)果表示坠敷,迭代過程也是按照行進(jìn)行的迭代:也就和我們r(jià)eadlines迭代結(jié)果一樣妙同;
import collections
file=open('a.text','r')
isc=isinstance(file,collections.Iterator)
print(isc)
for i in file:
????print(i,end='')
5.判定是否可讀射富,或者是否可寫:主要是增加程序容錯(cuò)率,通過readable和writable粥帚,able表示能力胰耗;
print(file.readable())
print(file.writable())
注意:我們學(xué)了這么多讀取的方法,那我們什么時(shí)候該使用什么方法呢芒涡,這個(gè)就要根據(jù)文件大小決定了柴灯,如果文件特別大的話,我們肯定不能使用一次性讀取所有文件的方法了费尽,因?yàn)檫@種方法很耗內(nèi)存赠群,這種情況我們就應(yīng)該一行一行的讀,就可以使用readline或者用file這個(gè)迭代器旱幼,當(dāng)文件比較小的時(shí)候乎串,我們就可以一次性讀完,使用read和readlines方法速警;
寫入:就是用的write()函數(shù)叹誉,之前已經(jīng)用過了,只需要知道一點(diǎn)就是write函數(shù)有返回值闷旧,并且這個(gè)返回值就是寫入的字節(jié)數(shù)长豁,我們寫了多少個(gè)字節(jié)進(jìn)去就會(huì)返回多少;
關(guān)閉:close(),其實(shí)他有兩個(gè)作用忙灼,第一是可以釋放系統(tǒng)資源匠襟,第二是可以把緩沖區(qū)的數(shù)據(jù)立馬寫進(jìn)磁盤,比如我們系統(tǒng)只有10根管道该园,那現(xiàn)在10根管道都被使用了酸舍,那在需要使用管道的時(shí)候,是不是就沒了呢里初,就會(huì)等前面的用完了才有管道使用了啃勉,所以我們用完就趕緊釋放,不然占著茅坑不拉屎双妨,系統(tǒng)會(huì)很慢的淮阐,第二點(diǎn),我們?cè)趫?zhí)行寫數(shù)據(jù)的時(shí)候刁品,其實(shí)并不是一執(zhí)行到write就會(huì)立馬往磁盤寫泣特,而是先放入緩沖區(qū),等緩沖區(qū)滿了才往里面寫挑随,或者等一會(huì)才寫入状您,就為了減少io操作次數(shù),說白了也是為了不浪費(fèi)資源,而當(dāng)我們執(zhí)行了close過后就會(huì)立馬把緩沖區(qū)的數(shù)據(jù)寫進(jìn)磁盤膏孟;補(bǔ)充:flush()也可以達(dá)到把緩沖區(qū)的數(shù)據(jù)寫進(jìn)磁盤:
file=open('a.text','w')
file.write('aaa')
file.flush()
file.close()
文件的相關(guān)操作:操作文件是在os模塊下眯分,所以我們應(yīng)該先導(dǎo)入os模塊,然后執(zhí)行各種操作:
1.修改單個(gè)文件夾或者文件骆莹,使用rename():
import os os.rename('alone','busy')
os.rename('a.text','b.text')
2.修改樹狀級(jí)文件:使用renames():
os.renames('busy/busy.text','alone/alone.text')
3.刪除文件:remove()函數(shù)颗搂,如果文件不存在則報(bào)錯(cuò):
os.remove('b.text')
4.刪除文件夾:rmdir担猛,不能遞歸刪除文件夾幕垦,如果文件夾不為空則報(bào)錯(cuò)
os.rmdir('alone')
5.刪除文件夾:removedirs(),遞歸刪除文件夾,如果文件夾不為空則報(bào)錯(cuò)傅联;
os.removedirs('alone/a')
6.創(chuàng)建單個(gè)文件夾:
os.mkdir('a')
7.遞歸創(chuàng)建多個(gè)文件夾:
os.makedirs('v/b')
8.獲取當(dāng)前目錄:
print(os.getcwd())
9.改變默認(rèn)目錄:
os.chdir('v')
10.獲取目錄內(nèi)容列表先改,返回的是列表:其中'./'表示當(dāng)前目錄,‘../’表示上一層目錄蒸走;
print(os.listdir('./'))
print(os.listdir('../'))