文件的操做在從此的Python開發中也是使用很是頻繁的。linux
#按照上面所說的流程 f = open('demo.txt')#1.打開文件,句柄賦值給f data = f.read()#2.對文件操做,讀取文件內容 print(data)#打印文件 f.close()#3.關閉文件 #按照上面的流程,就完成了對文件的基本操做
前面咱們用打開文件,並無地方選擇打開的模式,其實默認就是使用了「只讀模式」(r),在只讀模式下咱們只能讀取文件內容,而不能對文件進行寫入,追加等操做。windows
那若是想要寫入怎麼辦,這裏就要用到打開模式了。編碼
打開文件是模式有以下:spa
那麼如何使用呢?其實很簡單,下面寫一個例子:code
f = open('demo.txt','w') f.write('test') f.close() #咱們只須要在open的時候加上‘w’,就能夠對文件進行寫入操做了
若是想同時讀取又能夠寫入怎麼辦?打開模式中有個‘"+"表示能夠同時讀寫文件blog
還有一個「U」表示在讀取時,能夠將 \r\n自動轉換成 \n內存
"b"表示處理二進制文件,若是咱們打開的文件不是文本,並且其餘類型的文件就會用到這個模式utf-8
(使用場景:FTP發送上傳的文件,linux中能夠忽略,windows處理二進制文件時需標註)資源
前面咱們都沒有使用到打開編碼,其實默認都是 「gbk」開發
若是咱們文件是utf-8編碼的格式,且內容中存在中文,則讀取的時候不會報錯能夠正常讀取,
若是文件是utf-8編碼格式的,內容中添加了中文,這個時候咱們默認編碼打卡就會報錯,以下:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xac in position 5: illegal multibyte sequence
這個時候後咱們就要用到 encoding 對打開文件編碼格式的修改:
f = open('demo.txt','r+', encoding='utf-8') #加上encoding='utf-8'就不會出現報錯,或者中文亂碼了
前面咱們讀取文件內容,都是一次性讀取所有內容,這樣操做若是文件小還行,若是文件特別大,內容特別多,好比1G、10G等,則會讓咱們的電腦卡死,甚至內存溢出。
針對大文件的操做,咱們其實能夠每次只讀一行,讀完一行在內存中就刪除
f = open('demo.txt','r+', encoding='utf-8') #只要使用這種循環,讀一條,刪一條,內存中只保存一行數據 for line in f: print(line) f.close() #此方法針對大文件操做效果顯著
上面咱們用追加模式打開,而後寫入文件就能夠把追加的內容寫入到文件中了。
若是要修改和刪除,是否是用讀寫模式,把內容讀出來,修改或刪除內容,而後在重新寫入到文件中,就能夠實現刪除和修改了。
可是,咱們剛剛提到了大文件,假設20G的文件,你不可能所有讀出來,在修改或刪除相應內容以後,在從新寫入文件,你的程序直接卡死了。那怎麼辦呢?
其實仍是用到上面大文件操做的方式,咱們一條一條讀,而後一條一條寫
#思路就是一行一行讀出源文件內容,在一行一行寫入新的文件中 f = open('demo.txt', 'r+', encoding='utf-8')#原文件 f2 = open('demo2.txt', 'a', encoding='utf-8')#修改後保存的新文件 for line in f: #判斷若是行中有出現'zhangsan'則修改爲'lisi' if 'zhangsan' in line: line = line.replace('zhangsan', 'lisi') #判斷若是行中有出現'wangwu'則跳過,既這行不添加到新文件,至關於刪除了這行 elif 'wangwu' in line: continue f2.write(line)#最後修改過的內容一行一行寫入到新的文件中 print(line) f.close() f2.close()
前面咱們說了,文件打開就要關閉。可是咱們常常忘記關閉,怎麼辦呢?
Python提供了一個 with語句,使用方式:
#使用with語句,當with代碼塊執行完畢時,內部會自動關閉並釋放文件資源。 with open('demo.txt', 'r', encoding='utf-8') as f: pass #在Python2.7之後,with還同時支持操做多個文件 with open('demo.txt', 'r', encoding='utf-8') as f, open('demo2.txt', 'r', encoding='utf-8') as f2: pass
關於Python中的文件操做經常使用的方法就寫這麼多,還有一些如
tell
seek
seekable...等等之類的方法,在你們實際使用的時候在具體瞭解吧。