Python中對文件的相關操作詳解
文件的操作在今后的Python開發中也是使用非常頻繁的。
先說下對文件操作的流程
- 打開文件,得到文件的一個句柄,賦值給一個變量
- 然后通過句柄對文件進行操作(內容的增、刪、改、查)
- 最后要關閉文件(有打開就要有關閉,否則文件會一直被暫用,直到程序運行結束。)
文件的基本操作
#按照上面所說的流程 f = open('demo.txt')#1.打開文件,句柄賦值給f data = f.read()#2.對文件操作,讀取文件內容 print(data)#打印文件 f.close()#3.關閉文件 #按照上面的流程,就完成了對文件的基本操作
打開文件模式
前面我們用打開文件,並沒有地方選擇打開的模式,其實默認就是使用了“只讀模式”(r),在只讀模式下我們只能讀取文件內容,而不能對文件進行寫入,追加等操作。
那如果想要寫入怎么辦,這里就要用到打開模式了。
打開文件是模式有如下:
- r,只讀模式(默認)
- w,只寫模式。(不可讀,不存在文件時則創建,存在時則刪除原有內容寫入新內容。)
- a,追加模式。(可讀,不存在文件時則創建,存在時則在原有內容上追加新內容。)
那么如何使用呢?其實很簡單,下面寫一個例子:
f = open('demo.txt','w') f.write('test') f.close() #我們只需要在open的時候加上‘w’,就可以對文件進行寫入操作了
如果想同時讀取又可以寫入怎么辦?打開模式中有個‘"+"表示可以同時讀寫文件
- r+,可讀寫文件。(可讀,可寫,可追加)
- w+,寫讀
- a+,和a是一樣的
還有一個“U”表示在讀取時,可以將 \r\n自動轉換成 \n
- rU
- r+U
"b"表示處理二進制文件,如果我們打開的文件不是文本,而且其他類型的文件就會用到這個模式
(使用場景:FTP發送上傳的文件,linux中可以忽略,windows處理二進制文件時需標注)
- rb
- wb
- ab
打開文件編碼
前面我們都沒有使用到打開編碼,其實默認都是 “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()
with 語句
前面我們說了,文件打開就要關閉。但是我們經常忘記關閉,怎么辦呢?
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
...
等等之類的方法,在大家實際使用的時候在具體了解吧。