字元編碼與檔案處理

平行的X發表於2020-11-25

字元編碼
1、什麼是字元編碼
文字元號--------編碼------------>數字
文字元號<--------解碼------------數字
我們要將計算機上的檔案資料儲存到硬碟當中,但肯定不能直接儲存進去,硬碟只能接受二進位制,所以我們在儲存進硬碟的時候都會先將其轉換為二進位制

字元編碼表:
    一個字元對應一個數字

2、為何要研究字元編碼
為了解決亂碼問題:
1、存取都用同一張字元編碼表

3、字元編碼表的發展歷程
1、一家獨大
ASCII:只能識別英文字元
用8個bit對應一個英文字元
最開始美國製定字元編碼的時候考慮到是為了自己的人使用,所以能接受轉換的只有英文,只有這一種編碼表,所以能互相交流
2、天下大亂
GBK:能識別中文和英文
用16個bit(2Bytes)對應一個字元
後來電腦發展,各個國家也開始使用,但由於有些國家並不是英語為主體的,所以他們也製作了適合自己國家的字元編碼,但由於語言不是互通的,導致有些並不能翻譯,就會導致亂碼
shift-JIS(日本的字元編碼)

    Euc-KR
3、歸於一統
    unicode:能識別萬國字元
        用16bit(2Bytes)對應一個字元

    utf-8

後來統一製作能識別萬國字元的unicode,所以現在可以解碼很多資料,utf-8可以看作unicode的穩定升級版,但是並不能拿來完全解碼,只有等到使用unicode的舊軟體退場後才能完全使用,現在大部分軟體都是預設utf-8,就是為了方便編碼和解碼

總結:
英文字元----》記憶體(ASCII格式的二進位制數)----》硬碟(ASCII格式的二進位制數)

中文、英文字元—》記憶體(GBK格式的二進位制數)----》硬碟(GBK格式的二進位制數)
日文、英文字元—》記憶體(Shif-jis格式的二進位制數)–》硬碟(Shif-jis格式的二進位制數)

萬國字元----》記憶體(unicode格式的二進位制數)--》硬碟(utf-8格式的二進位制數)

5、執行python程式的三個階段
1、先啟動一個python直譯器
2、python直譯器會將檔案內容從硬碟讀入記憶體
3、python直譯器會解釋執行剛剛讀入記憶體的程式碼,識別語法
x=“你好hello”

編碼和解碼的步驟

# 字元-------------》unicode格式的二進位制(記憶體)--------------->utf-8格式的二進位制(硬碟)
#        編碼                                     編碼

# 字元《-------------unicode格式的二進位制(記憶體)<---------------utf-8格式的二進位制(硬碟)
#        解碼                                     解碼

一個小"栗子":

x="上"
print(x)  # 列印unicode等同於列印字元

utf8_res=x.encode("utf-8")#將x用utf-8進行編碼
# print(utf8_res,type(utf8_res))  # bytes等於二進位制#輸出編碼後的二進位制,也輸出型別

unicode_res=utf8_res.decode("utf-8")#用utf-8格式進行解碼
print(unicode_res)#輸出解碼後的內容

檔案處理的基本步驟

# f=open("aaa.py",mode='rt',encoding='gbk')#開啟aaa.py檔案,模式用只讀,用txt顯示,字元編碼是gbk
#
# res=f.read()#先讀裡面的內容並且賦值給res
# print(res)#輸出res
#
# f.close()#關掉作業系統佔用的資源

# f.read()#沒法呼叫這個功能

上下文管理

with open(“aaa.py”,mode=‘rt’,encoding=‘gbk’) as f:#呼叫with方法,當程式碼離開with語句時,會自動關閉
res = f.read()
print(res)

檔案開啟模式
一:控制讀寫操作模式
r:只讀===========>預設(只要不寫出來就是預設狀態)
w:只寫(如果存在檔案,就會清空檔案內容)
a:只追加寫(跳轉到檔案末尾來追加,注意不是最後一行新新增一行,是直接接著最後一行後面)

二:控制讀寫內容的模式
t:讀寫都是文字格式,即讀寫都是用字串========》預設
b:讀寫都是bytes格式,bytes等同於二進位制#使用b的時候不用指定字元編碼,但是要注意開啟的檔案大小,因為可能檔案過大會對記憶體有影響

強調:
如果是t模式,一定記住加上encoding=“編碼格式”
如果是b模式,一定記住別加encoding=“編碼格式”

三 案例

# 3.1 案例1
# r:在檔案存在的時候,檔案指標調到檔案開頭,檔案不存在直接報錯
# f=open("a.txt",mode="rt",encoding='utf-8')
# # res=f.read()
# # print(res)
# f.close()
3.2 案例2
# w:在檔案存在的時候會清空檔案,檔案指標調到檔案開頭,檔案不存在會建立空文件
# f=open("c.txt",mode="wt",encoding='utf-8')
# # f.write("aaaa\n")
# # f.write("bbbb\n")
# # f.write("cccc\n")
# f.write("11111\n")
# f.close()
3.3 案例3
# a:在檔案存在的時候不會清空檔案,檔案指標調到檔案末尾,檔案不存在會建立空文件
# f=open("d.txt",mode="at",encoding='utf-8')#a是追加,只會在末尾繼續寫,要換行需要自己新增換行符
# f.write("6666666\n")
# f.write("6666666\n")
# f.write("6666666\n")
# f.write("11111\n")
# f.close()
3.4 案例4:rb wb ab
# f=open("a.txt",mode='rb')#用二進位制的方式開啟檔案
# res=f.read()#將讀的結果賦值給res
# print(res.decode("utf-8"))#用utf-8解碼並列印
# f.close()#回收計算機資源

# f=open("D:\fullstack16\day05\視訊\01 本週內容.mp4",mode='rb')#用二進位制的方式開啟檔案
# res=f.read()#將讀的結果賦值給res
# print(res)#列印結果
# f.close()#回收資源

# f=open("a.txt",mode='ab')#開啟檔案,模式是追加,二進位制
# f.write("你好".encode('utf-8'))#寫入你好,並且用utf-8編碼
# f.close()#回收資源

# with open(r"D:\fullstack16\day05\視訊\01 本週內容.mp4",mode='rb') as f1,\
#     open(r"D:\111111.mp4",mode="wb") as f2:#開啟兩個檔案,並且f1的是僅讀,並且是二進位制,f2的是僅寫,二進位制
# res=f1.read()#將讀的結果賦值給res
# f2.write(res)#將res的內容寫入f2
這個方法適用於開啟的檔案不是很大的情況,不然記憶體容易被佔滿,容易卡住

# for line in f1:#迴圈讀出f1裡的內容
#     f2.write(line)#將line裡的內容依次寫入f2裡
這個方法適用於內容比較大的檔案

相關文章