利用python進行文件操作
作者: wyh草樣
什么是文件
文件是系統(tǒng)存儲區(qū)域的一個命名位置,用來存儲一些信息,便于后續(xù)訪問。能夠在非易失性存儲器中實現(xiàn)持續(xù)性存儲,比如在硬盤上。當(dāng)我們要讀取或者寫入文件時,我們需要打開文件;在操作完畢時,我們需要關(guān)閉文件,以便釋放和文件操作相關(guān)的系統(tǒng)資源,因此,文件操作的主要包括以下:
打開文件
- 讀取或者寫入
- 關(guān)閉文件
- 打開文件
Python使用內(nèi)置的open()函數(shù)打開一個文件,并且返回一個文件對象,也叫句柄(handle)。
f = open("test.txt") # 在本文件夾下面的一個文件 f = open("C:/Python33/README.txt") # 全路徑
再打開文件時,我們需要指定文件打開的模式,當(dāng)我們需要讀取文件時,使用f = open("test.txt", 'r'),寫入文件時,使用f = open("test.txt", 'w'),追加輸入時f = open("test.txt", 'a'),這里的a就是append的意思。追加模式和寫入模式的區(qū)別就是,寫入模式打開一個文件時,無論這個文件是否有內(nèi)容,都會被清空再寫入;在使用追加模式時,打開的文件,只是在原有的內(nèi)容上繼續(xù)進行寫入。同時我們也要制定以文本模式打開還是二進制模式打開。
文本模式(text mode)和二進制(binary mode)模式的區(qū)別
文本模式中,讀取時操作系統(tǒng)的換行符('\n' on Unix,'\r\n' on Windows)會被轉(zhuǎn)換成Python的默認(rèn)換行符\n,寫入時會將默認(rèn)的換行符轉(zhuǎn)換為操作系統(tǒng)的換行符;在二進制模式中不會轉(zhuǎn)換。這個轉(zhuǎn)化在對文本文件沒有影響,但是對于二進制數(shù)據(jù)會有影響,比如圖像文件或者EXE文件等。因此, 再打開這類文件時,一般使用二進制模式進行讀寫
常用模式
r | 文本模式,讀取 | |
rb | 二進制模式,讀取 | |
w | 文本模式,寫入 | |
wb | 二進制模式,寫入 | |
a | 文本模式,追加 | |
ab | 二進制模式,追加 | |
+ | 可讀可寫 |
f = open("test.txt", 'r') # 讀模式 f = open("test.txt", 'w') # 寫模式 f = open("img.bmp",'r+') # 可讀可寫 f = open("img.bmp",'w+') # 可讀可寫 f = open("img.bmp",'rb') # 二進制讀取
如何關(guān)閉文件
當(dāng)文件操作結(jié)束時,我們最好主動關(guān)閉文件。盡管Python有垃圾回收(garbage collector)機制,去清理不用的對象,但是最好還是自己關(guān)閉文件。
最簡單的方法就是:
f = open("app.log", 'r') do_something() f.close()
但是這個辦法不安全,因為在進行其他操作時,可能會出現(xiàn)異常,程序退出,那么關(guān)閉文件的語句就不會被執(zhí)行。
因此,可以用語句來處理:
try: f = open('app.log', 'r') do_something() finally: f.close()
無論是否發(fā)生異常,關(guān)閉文件的指令都會被執(zhí)行。
但是python官方給出的最佳用法是:
with open('app.log', 'r') as f: do_something()
使用這種用法,我們不必調(diào)用close()方法,在with語句程序內(nèi)部就會執(zhí)行,無論內(nèi)部是否出現(xiàn)異常。with語句被稱為上下文管理器,我們可以暫且不管這個的原理,只需要知道使用with語句,關(guān)閉文件的操作會被自動執(zhí)行,這也是官方推薦的最佳用法,比用語句寫起來簡單。
文件操作
寫入文件
主要介紹兩個方法:
1.write()方法
這個方法的參數(shù)是一個單獨的字符串,比如:
lines = ['line1', 'line2'] with open('filename.txt', 'w') as f: s = '' for data in lines: s += data s += '\n' f.write(s)
其實更好的寫法是使用join函數(shù):
lines = ['line1', 'line2'] with open('filename.txt', 'w') as f: f.write('\n'.join(lines))
其實更加優(yōu)雅的寫法,可以使用生成器:
lines = ['line1', 'line2'] with open('filename.txt', 'w') as f: f.writelines("%s\n" % l for l in lines)
讀取文件
這里介紹四種用法,后面都默認(rèn)文件已經(jīng)被打開了:
1.read()方法
result = f.read()
這里返回的是文件內(nèi)容,是str類型的結(jié)果,這個方法還帶一個數(shù)值類型的參數(shù),指定讀取多少內(nèi)容,如果省略了或者是負(fù)數(shù),那么就返回文件的全部內(nèi)容。
2.readline()方法
result = f.readline()
返回的也是字符串,不過是一行內(nèi)容,繼續(xù)調(diào)用,就會返回下一行內(nèi)容
3.readlines()方法
result = f.readlines()
這里返回的是一個列表,但是當(dāng)數(shù)據(jù)較大時,這樣的用法會很占用內(nèi)存,不推薦在數(shù)據(jù)量大時使用
4.直接循環(huán)文件對象
for line in f: print line do_something()
這樣的用法節(jié)省內(nèi)存,快速,并且代碼還簡單
result = f.readlines() ------------------------ result = list(f)
這兩種寫法返回的結(jié)果是一樣的
顯然我們推薦第四種用法。
如何處理大文件
大文件主要問題在于占用內(nèi)存較大,我們不能一下子將文件全部內(nèi)容讀入內(nèi)存,最好的做法如下:
with open("log.txt") as f: for line in f: do_something_with(line)
一行一行讀取,內(nèi)存不會爆,同時速度也更快,使用with語句,無論內(nèi)部是否出現(xiàn)異常,在結(jié)束時,文件對象都會被關(guān)閉,因此在處理大文件時,最好這樣來做。
以上就是利用python進行文件操作的詳細(xì)內(nèi)容,更多關(guān)于python 文件操作的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼(支持多人聊天與私聊)
這篇文章主要介紹了Python實現(xiàn)網(wǎng)絡(luò)聊天室的示例代碼(支持多人聊天與私聊),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Python圖像處理之圖像的縮放、旋轉(zhuǎn)與翻轉(zhuǎn)實現(xiàn)方法示例
這篇文章主要介紹了Python圖像處理之圖像的縮放、旋轉(zhuǎn)與翻轉(zhuǎn)實現(xiàn)方法,結(jié)合實例形式分析了Python使用resize()、rotate()及transpose()等函數(shù)進行圖像的縮放、旋轉(zhuǎn)及翻轉(zhuǎn)相關(guān)操作技巧,需要的朋友可以參考下2019-01-01詳解opencv中畫圓circle函數(shù)和橢圓ellipse函數(shù)
這篇文章主要介紹了opencv中畫圓circle函數(shù)和橢圓ellipse函數(shù),本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12Pandas數(shù)值排序 sort_values()的使用
本文主要介紹了Pandas數(shù)值排序 sort_values()的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07解決python3.x安裝numpy成功但import出錯的問題
這篇文章主要介紹了解決python3.x安裝numpy成功但import出錯的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11