標籤:令行 沒有 傳輸 方式 是的 編碼 迴圈讀取 byte 好的
Python中檔案處理的操作包括讀、寫、修改,今天我們一起來先學習下讀和寫操作。
一、檔案的讀操作
例一:
#檔案讀操作f = open(file="first_blog.txt",mode = ‘r‘,encoding=‘gbk‘)#‘r’表示唯讀模式(開啟仍然為檔案),encoding = ‘gbk‘表示原檔案的儲存格式為‘gbk‘,開啟時必須告訴程式將gbk轉成unicode(python3編碼預設Unicode)data = f.read() # 讀取所有內容,內容是已經轉換完畢的字串print(data) # 列印到螢幕f.close()#檔案開啟後必須關閉
‘‘‘
輸出:
write by congcong
Hello world!
這是我用python開啟的第一個檔案。
‘‘‘
例二:
#檔案二進位讀模式f = open(file="first_blog.txt",mode = ‘rb‘)#‘rb’表示以二進位讀模式(硬碟存為存的二進位開啟就為二進位,並且不再需要指定編碼)data = f.read()print(data)f.close()‘‘‘輸出: b‘write by congcong\r\n\r\nHello world!\r\n\r\n\xd5\xe2\xca\xc7\xce\xd2\xd3\xc3python\xb4\xf2\xbf\xaa\xb5\xc4\xb5\xda\xd2\xbb\xb8\xf6\xce\xc4\xbc\xfe\xa1\xa3\r\n\r\n‘ ‘‘‘
大家能看出例一和例二的區別嗎?
區別在於例二直接以rb模式開啟了檔案 ,rb是指二進位模式,資料讀到記憶體裡直接是bytes格式,
如果想要看內容,還需要手動decode,因此在檔案開啟階段,不需要指定編碼。
那如果我們不知道一個檔案是以什麼編碼儲存的怎麼辦呢?
方式一:嘗試使用各種編碼方式,總有一款是的,的確可以,不過感覺傻傻的,有沒有更好的方法呢?
方法二:匯入一個叫 chardet 的外部工具(首先你要連網安裝,Python3安裝方法命令列輸入:pip3 install chardet)
import chardetres = chardet.detect(open(‘first_blog.txt‘,mode=‘rb‘).read())print(res)‘‘‘輸出:{‘encoding‘: ‘GB2312‘, ‘confidence‘: 0.99, ‘language‘: ‘Chinese‘} # confidence 表示可信程度
‘‘‘
例三(迴圈讀取):
# -*- coding:utf-8 -*-f = open("for_line.txt",mode = ‘r‘,encoding=‘gbk‘)for line in f: #按行讀取 print(line)f.close()‘‘‘輸出: 鍵盤字母排序如下: qwertyuiop asdfghjkl zxcvbnm‘‘‘#中間有空行的原因:print本身有換行的特點
注意:
- 檔案操作時,以 “r”或“rb” 模式開啟,則只能讀,無法寫入;
- 硬碟上儲存的檔案都是某種編碼的0101010,開啟時需要注意:
- rb,直接讀取檔案儲存時原生的0101010,在Python中用位元組類型表示
- r和encoding,讀取硬碟的0101010,並按照encoding指定的編碼格式進行斷句,再將“斷句”後的每一段0101010轉換成unicode的 010101010101,在Python中用字串類型表示
二、檔案的寫操作
寫操作裡可以分為覆蓋寫檔案(‘w’和‘wb’)和追加寫檔案(‘a’和‘ab’)兩大類。
1、覆蓋寫檔案
樣本如下:
# -*- coding:utf-8 -*-#特別注意當mode的模式為‘w’時,是建立新檔案,當檔案名稱與原檔案相同時,原檔案被清空重寫f = open("write.txt",mode = ‘w‘,encoding=‘gbk‘) #普通檔案的寫f.write(‘這是第一個我用Python寫的檔案!‘) # 自動將寫的Unicode字串轉為gbk編碼的二進位串。f.close()f2 = open("write2.txt",mode = ‘wb‘) #以二進位寫檔案,主要用於視頻圖片等檔案的傳輸f2.write("這是用二進位寫的第一個檔案!".encode(‘gbk‘))# 二進位寫必須要加encode(),將寫的unicode進行編碼成指定格式的二進位儲存,Python3預設是utf-8
f2.close()
注意:
檔案覆蓋寫操作時,以 “w”或“wb” 模式開啟,則只能寫,並且在開啟的同時會先將內容清空。
寫入到硬碟上時,必須是某種編碼的0101010,開啟時需要注意:
-
- wb,寫入時需要直接傳入以某種編碼的0100101,即:位元組類型,二進位寫必須加encode()將寫的Unicode
- w 和 encoding,寫入時需要傳入unicode字串,內部會根據encoding制定的編碼將unicode字串轉換為該編碼的 010101010
2、追加寫檔案
樣本如下:
#特別注意當mode的模式為‘a’時,是檔案追加模式,就是接著寫檔案f3 = open(‘write.txt‘,mode=‘a‘,encoding=‘gbk‘)f3.write(‘\n這是追加的文本1!‘) # 自動將寫的Unicode字串轉為gbk編碼的二進位串。
f3.write(‘\n這是追加的文本2!‘)
f3.write(‘\n這是追加的文本3!‘)
f3.close()
f4 = open(‘write3.txt‘,mode = ‘ab‘)#以二進位追加檔案,主要用於視頻圖片等檔案的傳輸
f4.write(‘\n這是用二進位追加的檔案!‘.encode(‘gbk‘)) # 二進位追加寫也必須要加encode(),將寫的unicode進行編碼成指定格式的二進位儲存,Python3預設是utf-8
f4.close()
檔案追加寫操作時,以 “a”或“ab” 模式開啟,則只能追加,即:在原來內容的尾部追加內容
寫入到硬碟上時,必須是某種編碼的0101010,開啟時需要注意:
-
- ab,寫入時需要直接傳入以某種編碼的0100101,即:位元組類型,二進位追加寫必須加encode()將寫的unicode字串轉為指定編碼的二進位串,不指定時Python3預設utf-8。
- a 和 encoding,寫入時需要傳入unicode字串,內部會根據encoding制定的編碼將unicode字串轉換為該編碼的 010101010
三、檔案的讀寫(r+)和寫讀(w+)混合模式
1、檔案的讀寫(r+)
樣本如下:
#-*-coding:utf-8-*-f = open(file=‘write.txt‘,mode=‘r+‘,encoding=‘gbk‘) # r+ 表示讀寫入模式print(‘讀寫前:\n‘,f.read())f.write(‘這是讀寫入模式下的內容\n‘)f.write(‘這是讀寫入模式下的內容\n‘)print(‘讀寫後:\n‘,f.read())f.close()‘‘‘讀寫前: 這是第一個我用Python寫的檔案!這是追加的文本1!這是追加的文本2!這是追加的文本3!讀寫後:‘‘‘
注意:讀寫入模式下只能查看之前已存在的內容,而寫入的內容無法再讀出來(與游標的移動有關,下一篇會細說),開啟檔案查看,寫入的內容已經追加到了之前寫的最後面。
2、檔案的寫讀(‘w+’,使用非常少,瞭解即可)
樣本如下:
# -*-coding:utf-8-*-f = open(file=‘write.txt‘,mode=‘w+‘,encoding=‘gbk‘)print(‘寫讀前:\n‘,f.read())f.write(‘這是寫讀模式下的內容\n‘)f.write(‘這是寫讀模式下的內容\n‘)print(‘寫讀後:\n‘,f.read())f.close()‘‘‘寫讀前: 寫讀後:‘‘‘
注意: 檔案的寫讀模式會先清空原先檔案裡存在的內容,再寫入你即將要寫的內容,相當於覆蓋寫,不同在於可以查看寫入的內容,
需要移動檔案中游標位置。下一篇的檔案常用操作方法中會細品。
python檔案處理-讀、寫