python—文件处理
文件相關(guān)操作
計(jì)算機(jī)系統(tǒng)分為:計(jì)算機(jī)硬件,操作系統(tǒng),應(yīng)用程序三部分。我們用python或其他語(yǔ)言編寫的應(yīng)用程序若想要把數(shù)據(jù)永久保存下來(lái),必須要保存于硬盤中,這就涉及到應(yīng)用程序要操作硬件,應(yīng)用程序是無(wú)法直接操作硬件的,這就用到了操作系統(tǒng)。操作系統(tǒng)把復(fù)雜的硬件操作封裝成簡(jiǎn)單的接口給用戶/應(yīng)用程序使用,其中文件就是操作系統(tǒng)提供給應(yīng)用程序來(lái)操作硬盤虛擬概念,用戶或應(yīng)用程序通過(guò)操作文件,可以將自己的數(shù)據(jù)永久保存下來(lái)。
?【注】
? ? # 在同一個(gè)文件夾下(‘zhouyuan’這個(gè)文件與‘文件處理.py'文件在同一處)直接可以open加文件名。【】
??? #Windows操作系統(tǒng)是gbk編碼,而pycharm是默認(rèn)utf-8編碼,open函數(shù)解鎖當(dāng)前操作系統(tǒng)的編碼,gbk不能解碼utf-8編碼的文件。
? ? #在文件夾中編寫文件pycharm是自動(dòng)保存的。
? ? #對(duì)于文件是可以在建立文件是修改它的編碼方式的,例如,在pycharm的右下角,默認(rèn)的utf-8編碼改成與Windows一致的gbk編碼,就可以不用encoding='utf-8' 修改解碼方式與pycharm一致了。
??? #什么是句柄?類比于應(yīng)用程序無(wú)法直接去操作硬盤上的數(shù)據(jù),此時(shí)操作系統(tǒng)需要提供一個(gè)句柄,并復(fù)制給一個(gè)變量。
文件句柄 = open('文件路徑', '模式')?
??? #關(guān)閉文件 f.close()
1 f=open('zhoutao',encoding='utf-8') 2 data=f.read() 3 print(data) 4 f.close()?
? ? #文件處理流程:
1 文件處理流程: 2 1.打開文件,得到文件句柄并賦值給一個(gè)變量 3 2. 通過(guò)句柄對(duì)文件進(jìn)行操作 4 3. 關(guān)閉文件?
#資源回收: 打開一個(gè)文件包含兩部分資源:操作系統(tǒng)級(jí)打開的文件+應(yīng)用程序的變量。在操作完畢一個(gè)文件時(shí),必須把與該文件的這兩部分資源一個(gè)不落地回收,回收方法為: 1、f.close() #回收操作系統(tǒng)級(jí)打開的文件 2、del f #回收應(yīng)用程序級(jí)的變量 其中del f一定要發(fā)生在f.close()之后,否則就會(huì)導(dǎo)致操作系統(tǒng)打開的文件還沒有關(guān)閉,白白占用資源, 而python自動(dòng)的垃圾回收機(jī)制決定了我們無(wú)需考慮del f,這就要求我們,在操作完畢文件后,一定要記住f.close() f=open(...)是由操作系統(tǒng)打開文件,那么如果我們沒有為open指定編碼,那么打開文件的默認(rèn)編碼很明顯是操作系統(tǒng)說(shuō)了算了,操作系統(tǒng)會(huì)用自己的默認(rèn)編碼去打開文件,在windows下是gbk,在linux下是utf-8。 這就用到了上節(jié)課講的字符編碼的知識(shí):若要保證不亂碼,文件以什么方式存的,就要以什么方式打開。 f=open('a.txt','r',encoding='utf-8')?
?
?【1】文件處理讀操作 (read(),readline(),readable(),readlines())
1 f=open('zhoutao',‘r’) 2 # data=f.read() 3 # print(data) 4 print(f.readable()) #readable()是否可讀,結(jié)果是True False 5 print(f.readline()) #readline()讀取一行 6 print(f.readline()) 7 print(f.readline()) 8 f.close() 9 #結(jié)果:True 10 # 周濤 11 # zhou 12 # yuan 13 14 f=open('zhoutao') 15 data=f.read() 16 print(data) 17 print(f.readable()) 18 print(f.readline()) #最后游標(biāo)已經(jīng)到了最后一行,再readline已經(jīng)沒有結(jié)果 19 f.close() 20 #結(jié)果:周濤 21 # zhou 22 # yuan 23 # 濤 24 # True 25 26 f=open('zhoutao') 27 data=f.readlines() #readlines()每行作為一個(gè)字符串放入列表中 28 print(data) 29 f.close() 30 #結(jié)果:['周濤\n', 'zhou\n', 'yuan\n', '濤']?
? 【2】文件處理寫操作(write(),writelines())(標(biāo)明是'w'寫模式,如果原文件有內(nèi)容則會(huì)清空原內(nèi)容,如果原文件不存在則會(huì)自動(dòng)新建一個(gè)文件)
1 f=open('zhouyuan','w',encoding='utf-8') 2 # f.read() 3 f.write('周圓最美\n') 4 f.write('周濤最丑\n') 5 f.writelines(['666\n','888\n','999\n']) #文件內(nèi)容只能是字符串 6 f.close() 7 #結(jié)果:周圓最美 8 # 周濤最丑 9 # 666 10 # 888 11 # 999?
?? 【3】‘a(chǎn)’追加模式('a'直接追加到文件最后)
1 f=open('zhouyuan','a',encoding='utf-8') 2 f.write('寫到文件最后') 3 #結(jié)果:周圓最美 4 # 周濤最丑 5 # 666 6 # 888 7 # 999 8 # 寫到文件最后?
?? 【4】with使文件打開自動(dòng)關(guān)閉
1 with open('zhouyuan','w') as f: 2 f.write('666\n') 3 #結(jié)果:將‘zhouyuan’里面的內(nèi)容改成了‘666’?? 【5】文件的修改
文件的數(shù)據(jù)是存放于硬盤上的,因而只存在覆蓋、不存在修改這么一說(shuō),我們平時(shí)看到的修改文件,都是模擬出來(lái)的效果,具體的說(shuō)有兩種實(shí)現(xiàn)方式: 方式一:將硬盤存放的該文件的內(nèi)容全部加載到內(nèi)存,在內(nèi)存中是可以修改的,修改完畢后,再由內(nèi)存覆蓋到硬盤(word,vim,nodpad++等編輯器) 方式二:將硬盤存放的該文件的內(nèi)容一行一行地讀入內(nèi)存,修改完畢就寫入新文件,最后用新文件覆蓋源文件?
1 方法一: 2 import os 3 4 with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: 5 data=read_f.read() #全部讀入內(nèi)存,如果文件很大,會(huì)很卡 6 data=data.replace('alex','SB') #在內(nèi)存中完成修改 7 8 write_f.write(data) #一次性寫入新文件 9 10 os.remove('a.txt') 11 os.rename('.a.txt.swap','a.txt') 12 13 方法二: 14 import os 15 16 with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: 17 for line in read_f: 18 line=line.replace('alex','SB') 19 write_f.write(line) 20 21 os.remove('a.txt') 22 os.rename('.a.txt.swap','a.txt')?
文件處理b模式
?【b方式不能指定編碼,b表示原生二進(jìn)制字節(jié)形式】
1 f=open('zhouyuan','rb') 2 data=f.read() 3 #‘字符串------encode-------bytes’ 4 #bytes-------decode-------‘字符串’ 5 print(data) 6 print(data.decode('utf-8')) 7 #結(jié)果:b'666\r\n' #【b表示原生二進(jìn)制字節(jié)形式】 8 # 666?
1 f=open('zhouyuan','wb') 2 f.write(bytes('你好漂亮\n',encoding='utf-8')) #字符串以u(píng)tf-8編碼成字節(jié) 3 f.write('周圓'.encode('utf-8')) 4 #結(jié)果:你好漂亮 5 # 周圓?
1 f=open('zhouyuan','ab') 2 f.write('小仙女'.encode('utf-8')) 3 #結(jié)果:你好漂亮 4 # 周圓小仙女?
?
文件操作其他方法
?
1 f=open('a.txt','w',encoding=' gbk') 2 f.write('nihao') 3 print(f.closed) #判斷文件是否關(guān)閉 4 print(f.encoding) #顯示編碼,顯示打開的編碼,與文件以什么編碼存入無(wú)關(guān) 5 f.flush() #自動(dòng)保存,從內(nèi)存中到硬盤。不需要人工保存 6 print(f.tell()) #顯示光標(biāo)位置在哪 7 #結(jié)果:False 8 # gbk 9 # 5?
轉(zhuǎn)載于:https://www.cnblogs.com/zhouyuan666/p/9513170.html
總結(jié)
以上是生活随笔為你收集整理的python—文件处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【游戏开发引擎】 实验3:Captain
- 下一篇: 基础优化 标题优化 上下架注意事项 流量