python对文件的读写正确操作方式
1.with open函數打開文件的各種方式
| 模式 | 意義 |
|---|---|
| r | 只讀模式打開文件,讀文件內容的指針會放在文件的開頭。 操作的文件必須存在。 |
| rb | 以二進制格式、采用只讀模式打開文件,讀文件內容的指針位于文件的開頭,一般用于非文本文件,如圖片文件、音頻文件等。 |
| r+ | 打開文件后,既可以從頭讀取文件內容,也可以從開頭向文件中寫入新的內容,寫入的新內容會覆蓋文件中等長度的原有內容。 |
| rb+ | 以二進制格式、采用讀寫模式打開文件,讀寫文件的指針會放在文件的開頭,通常針對非文本文件(如音頻文件)。 |
| w | 以只寫模式打開文件,若該文件存在,打開時會清空文件中原有的內容。 若文件存在,會清空其原有內容(覆蓋文件);反之,則創建新文件。 |
| wb | 以二進制格式、只寫模式打開文件,一般用于非文本文件(如音頻文件) |
| w+ | 打開文件后,會對原有內容進行清空,并對該文件有讀寫權限。 |
| wb+ | 以二進制格式、讀寫模式打開文件,一般用于非文本文件 |
| a | 以追加模式打開一個文件,對文件只有寫入權限,如果文件已經存在,文件指針將放在文件的末尾(即新寫入內容會位于已有內容之后);反之,則會創建新文件。 |
| ab | 以二進制格式打開文件,并采用追加模式,對文件只有寫權限。如果該文件已存在,文件指針位于文件末尾(新寫入文件會位于已有內容之后);反之,則創建新文件。 |
| a+ | 以讀寫模式打開文件;如果文件存在,文件指針放在文件的末尾(新寫入文件會位于已有內容之后);反之,則創建新文件。 |
| ab+ | 以二進制模式打開文件,并采用追加模式,對文件具有讀寫權限,如果文件存在,則文件指針位于文件的末尾(新寫入文件會位于已有內容之后);反之,則創建新文件。 |
注:
1.文件打開模式,直接決定了后續可以對文件做哪些操作。例如,使用 r 模式打開的文件,后續編寫的代碼只能讀取文件,而無法修改文件內容.
2.r開頭的操作的文件最好存在,w開頭的若文件存在,會清空其原有內容(覆蓋文件);反之,則創建新文件
2.封裝使用(后續再補充)
import platform
class L_File():def __init__(self):if platform.system().lower() == 'windows':self.l_os="win"elif platform.system().lower() == 'linux':self.l_os="liunx"else:self.l_os="其他系統,暫不支持"def r_file(self,path):"""讀取文件,無論文件存不存在,都可以放心使用,不存在會報異常錯誤:param path::return:"""try:if self.l_os=="win":with open(path,"rb") as f:content=f.read()return contentexcept Exception as e:print("r_file:",e)def w_file(self,path,data):"""寫入文件,返回字符長度如果該路徑文件不存在,則創建并寫入如果該路徑文件存在,則覆蓋寫入:param path::return:"""try:if self.l_os == "win":with open(path,"wb") as f:content=f.write(data)return contentexcept Exception as e:print("w_file:",e)def bytes_str(self,data,file_decode="utf-8"):"""字節轉字符串默認解碼格式utf-8:return:"""try:data=data.decode(file_decode)return dataexcept Exception as e:print("bytes_str",e)def str_bytes(self,data,file_encode="utf-8"):"""字符串轉字節默認編碼格式utf-8:return:"""try:data=data.encode(file_encode)return dataexcept Exception as e:print("str_bytes:",e)cc=L_File()
cont="你好!"
#字符串轉字節
b_cont=cc.str_bytes(cont)
print("b_cont:",b_cont)#寫入文件數據
cc.w_file('1.txt',b_cont)#讀取文件數據
data=cc.r_file("1.txt")
print("data:",data)#字節轉字符串
data1=cc.bytes_str(data)
print("data1:",data1)
3.python3默認編碼
python3默認編碼為unicode,由str類型進行表示。二進制數據使用bytes類型表示
字符串通過編碼轉換成字節碼,字節碼通過解碼成為字符串
encode:str --> bytes
decode:bytes --> str
phython3默認編碼是utf-8, 內存里(也就是字符串) 是編碼是unicode,即使聲明了某種編碼,在內存里還是unicode。
python2文件默認編碼是ASCII,字符串默認也是ASCII,但是如果文件頭聲明了某種編碼,那字符串編碼就是那個編碼。但是python2有一個問題,就是如果你想寫中文,你的文件頭聲明了utf-8,python2的解釋器會用你聲明的編碼去給你解碼,加載到內存后也是用utf-8給你解碼,而不是unicode!這就意味著,你用windows(中文版windwos默認編碼是gbk)去執行的話就會出現亂碼。因為在windows上只有2種情況 ,你的windows上顯示才不會亂:
- 字符串以GBK格式顯示
- 字符串是unicode編碼
為什么在內存中用utf-8會出現亂碼,用unicode就不會呢?原因如下:
utf-8雖然壓縮了存儲空間,但是如果在內存中存儲,使用utf-8卻由于它的長度不固定,帶來了很大的不便,使得在內存處理字符變得復雜。應對這個問題的解決策略是:在內存中存儲字符時還是使用unicode編碼,因為unicode編碼的長度固定,處理起來很方便。而在文件的存儲中,則使用utf-8編碼,可以壓縮內存,節省空間。這里一般有個自動轉換的機制,即從文件中讀取utf-8編碼到內存時,會自動轉換為unicode編碼,而從內存中將字符保存到文件時,則自動轉換為utf-8編碼。
總結
以上是生活随笔為你收集整理的python对文件的读写正确操作方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 55道常见的计算机面试题
- 下一篇: 矩阵快速幂的问题