標籤:cat ble encoding 網路傳輸 是什麼 形式 code val 來講
1.檔案處理
f = open(file="file01.txt", mode="r", encoding="utf-8") #python3預設編碼格式為utf-8data = f.read()print(data)print(type(data)) # <class ‘str‘>f.close()
如果報錯
#UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xcc in position 0: invalid continuation byte
說明編碼不對。
按正常邏輯來講,檔案是以什麼方式存的,就應該用什麼方式去讀取,比如以gb2312存的,就應該以gb2312去讀。檔案是以utf-8存的,就用utf-8的編碼格式去讀。
2.檔案處理-二進位模式
檔案在電腦中是以二進位儲存的,我們可以不理會編碼,直接以二進位的形式讀取檔案內容
f = open(file="file01.txt", mode="rb")data = f.read()print(data)f.close()
以二進位方式讀取,mode = "rb"
,得到的結果也是二進位。
在讀取視頻、圖片等內容和網路傳輸的時候,會使用二進位方式讀取。
#列印結果 b‘\xef\xbb\xbf\xe7\x94\xb0\xe7\xbb\xb4\xe9\x80\x9a\t12001\t10\r\n\xe5\xbc\xa0\xe5\xae\xb6\xe9\x93\xad\t12002\t11\r\n\xe8\x88\x92\xe5\xa8\x85\t12003\t12\r\n\xe5\xad\x99\xe7\x8e\x89\xe5\x80\xa9\t12004\t13\r\n\xe5\xbc\xa0\xe8\xb6\x85\t12005\t14\r\n\xe7\x8e\x8b\xe4\xba\xac\t12006\t15\r\n\xe5\xbb\x96\xe6\x9e\x97\xe8\x8b\xb1\t12007\t16\r\n\xe5\xbe\x90\xe6\x99\x93\xe8\x8e\x89\t12008\t17\r\n\xe9\x87\x91\xe5\x98\x89\xe7\xa5\xba\t12009\t18\r\n\xe5\x8f\x8a\xe6\xa0\xbc\t12010\t19\r\n\xe4\xba\x8e\xe5\x87\xaf\xe9\x98\xb3\t12011\t20\r\n\xe6\x9d\x8e\xe4\xbf\x8a\xe7\xba\xa2\t12012\t21\r\n\xe5\x88\x98\xe5\x86\xac\t12013\t22\r\n‘
3.檔案處理-智能檢測編碼的工具
import chardetf = open(‘file01.txt‘, mode="rb")data = f.read()print(chardet.detect(data))#列印結果:#{‘encoding‘: ‘UTF-8-SIG‘, ‘confidence‘: 1.0, ‘language‘: ‘‘}#confidence,表示 encoding 為 UTF-8-SIG 的機率為 1.0
然後,當我們知道目標檔案是什麼格式後,data.decode("utf-8")
一下,就可以列印出我們需要的內容
4. 迴圈讀取逐條讀取檔案
f = open(‘file01.txt‘, ‘r‘, encoding=‘utf-8‘)for line in f: print(line, end="") # end = "" 表示,列印的時候以什麼結尾,此處可以去掉print預設的分行符號 \nf.close()
列印結果:
# 田維通 12001 10# 張家銘 12002 11# 舒婭 12003 12# 孫玉倩 12004 13# 張超 12005 14# 王京 12006 15# 廖林英 12007 16# 徐曉莉 12008 17 ...
5.寫檔案
#以 gbk 格式建立一個檔案,寫入內容“將進酒”f = open(file=‘file02.txt‘, mode=‘w‘, encoding=‘gbk‘)f.write(‘將進酒‘)f.close()
如果這個時候再寫一遍,即
f = open(file=‘file02.txt‘, mode=‘w‘, encoding=‘gbk‘) f.write(‘杯莫停‘)f.close()
得到的結果是:將原來的 file02.txt 檔案覆蓋掉了
6.寫檔案——追加
寫入內容追加的已有內容後面
f = open(‘file02.txt‘, ‘ab‘) #mode 為 ab 或 a,表示追加f.write(‘\n人生得意須盡歡‘.encode(‘gbk‘))f.close()
7.檔案處理-讀寫混合操作檔案
f = open(‘file02.txt‘, ‘r+‘, encoding=‘gbk‘)data = f.read()print("content:", data)f.write("\n鋤禾日當午")f.write("\n汗滴禾下土")f.write("\n離離原上草")f.write("\n一歲一枯榮")f.close()
結果:
8.檔案操作的其他功能(1)flush()
f = open(‘f_flush.txt‘, ‘w‘, encoding=‘utf-8‘)f.write(‘奇門遁甲‘) # 在f.close() 之前,寫入的內容是在記憶體中的,而且可能此時txt檔案裡是沒有內容的,所以可以加一句 f.flush(),把檔案強制從記憶體buffer裡重新整理到硬碟#一般記憶體裡的buffer滿了會自動重新整理到硬碟,但是使用 f.flush() 可控制強制重新整理到硬碟f.close()
(2)tell() seek()
# 常值內容: hello world!>>> f = open(‘file03.txt‘, ‘r‘, encoding=‘gbk‘)>>> f.tell() #返回當前檔案操作游標位置 0>>> f.seek(1) # 把操作檔案的游標移到指定位置1>>> f.read()‘ello world!‘
注意:tell(), seek()找的都是位元組,長度都是按位元組算的。另外,每個字元在不同編碼格式下所佔的位元組長度不一樣,gbk 一個中文佔2個位元組,utf-8 一個中文佔3個位元組
以中文為例:
# 檔案內容:技高一籌>>> f = open("file03.txt",‘r‘,encoding=‘gbk‘)>>> f.read()‘技高一籌‘>>> f.tell()8>>> f.seek(0) #把檔案游標移動到起點 00>>> f.seek(4) #把檔案游標移動到 4,此時,gbk 下,一個漢字佔2個位元組,此時游標的位置在 技高和一籌之間4>>> f.read() # 所以,讀取結果為 後兩個字‘一籌‘>>>#----------------------------------------------------------------------------->>> f.seek(1) #把檔案游標移動到 1,“半個字”,此時讀取內容不出問題,因為他只拿到了 技 字的一部分位元組,列印會報錯1>>> f.tell()1>>> f.read()Traceback (most recent call last): File "<stdin>", line 1, in <module>UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xef in position 6: incomplete multibyte sequence
(3)seekable() 判斷檔案是否可進行seek操作,readable() 判斷檔案是否可讀,writable()判斷檔案是否可寫(4) truncate() 按指定長度截斷檔案
#檔案內容: 技高一籌>>> f = open("file03.txt",‘r+‘,encoding=‘gbk‘)>>> f.seek(2)2>>> f.truncate()2>>> f.read() #檔案內容 只剩一個 “技” 字
truncate(4)指定長度的話,就從檔案開頭開始截斷指定長度,不指定長度的話,就從當前位置到檔案尾部的內容全去掉。
#檔案內容: 技高一籌>>> f = open("file03.txt",‘r+‘,encoding=‘gbk‘)>>> f.tell()0>>> f.truncate(4) #檔案內容 只剩一個 “技高” 字
9. 實現檔案內容的修改
import osf = open(‘file05.txt‘, ‘r+‘, encoding=‘gbk‘) #開啟file05.txt 檔案f_new = open(‘file05_new.txt‘, ‘w‘, encoding=‘gbk‘) # 建立一個新檔案old_str = ‘李四‘new_str = ‘李雲龍‘for line in f: if old_str in line: #逐行讀取 line = line.replace(old_str, new_str) #修改檔案中的內容 f_new.write(line) # 逐行讀取的內容寫到新建立的檔案中f.close() f_new.close()os.replace(‘file05_new.txt‘, ‘file05.txt‘) # 替換,以達到修改檔案內容的目的(window用os.replace()可實現,但是使用os.rename()不可以,會報錯,提示 file05.txt 已存在,無法建立)
python——檔案處理