字元編碼與檔案
字元編碼
字元編碼只跟文字檔案和字元有關,與視訊檔案、圖片檔案無關
什麼是字元編碼?
由於計算機內部只識別二進位制,但使用者在使用計算機的時候卻可以看到各式各樣的語言字元
字元編碼內部記錄了人類字元與數字對應關係的資料
字元編碼發展史
1.一家獨大
計算機最初是由美國人發明的,美國人為了能夠讓計算機識別英文字元
ASCII碼:裡面記錄了英文字元與數字的對應關係,用一個位元組來表示對應關係
所有的英文字元和符號加起來其實不超過127,之所以使用八位是為了後續發現新的語言
必須記住的對應關係有以下兩組:
A-Z:65-90
a-z:97-122
0-9: 48-57
2.群雄割據
中國人
為了能讓計算機識別中文,我們需要發明另外一套編碼表:GBK碼
GBK碼記錄了英文中文與數字的對應關係,對於英文還是使用一個位元組,對應中文使用兩個位元組甚至更多位元組
兩個位元組其實也不夠表示出所有的中文,遇到生僻字可能需要更多位來表示
日本人
為了能夠讓計算機識別日文,也需要發明一套編碼表
shift-JIS碼:記錄了日文英文與數字的對應關係
韓國人
為了能夠讓計算機識別韓文,也需要發明一套編碼表
Euc_kr碼:記錄了韓文英文與數字的對應關係
3.天下統一
為了能夠實現不同國家之間的文字資料能夠彼此無障礙交流需要對編碼統一
unicode(萬國碼)
統一使用兩個及以上字元記錄與數字的對應關係
utf8(萬國碼的優化版本)(現在預設使用的編碼)
將英文還是用一個位元組儲存
將中文使用三個位元組或更多位元組儲存
字元編碼實操
1.如何解決檔案亂碼的情況
檔案當初以什麼編碼編的,開啟就以什麼編碼解
2.python直譯器版本不同帶來的編碼差異
python2.X內部使用的編碼預設是ASCII
# 檔案頭
coding:utf8
在python2中定義字串前面要加一個小u
s = u'你'
python3.X內部使用utf8
3.編碼與解碼
編碼:將人類能夠讀懂的字元按照指定的編碼轉化成數字
解碼:將數字按照指定的編碼轉換成人類能夠讀懂的字元
s = '這是中文'
# 編碼:
res = s.encode('utf8')
print(res, type(res)) # bytes 在python中直接將該型別看成二進位制資料即可
# 解碼:
res1 = res.decode('utf8')
print(res1)
檔案操作
1.什麼是檔案?
檔案是作業系統暴露給使用者操作硬碟的快捷方式(介面)
2.程式碼如何操作
關鍵字open()
2.1 利用關鍵字open開啟檔案
2.2 利用其他方法操作檔案
2.3 關閉檔案
語法格式:
open(檔案路徑,讀寫模式,字元編碼)
檔案路徑與讀寫模式是必須的
字元編碼是可選的(有些模式需要編碼)
檔案路徑:
相對路徑與絕對路徑
路徑中出現了字母與斜槓的組合產生了特殊含義如何取消
在路徑字串前面加一個r
r'/Users/PycharmProjects/1110/a.txt'
open('a.txt')
open(r'/Users/PycharmProjects/1110/a.txt')
res = open('a.txt', 'r', encoding='utf8')
print(res.read())
res.close # 管壁檔案釋放資源
# with上下文管理(能夠自動幫你close())
with open(r'a.txt','r',encoding='utf8') as f1: # f1=open() f1.close()
print(f1.read())
"""以後程式碼操作檔案 推薦使用with語法"""
檔案讀寫模式
r 只讀模式
# 路徑不存在:直接報錯
with open(r'b.txt', 'r', encoding='utf8') as f:
pass # 補全語法結構 沒有實際含義
# 路徑存在
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.read()) # 讀取檔案內所有的內容
w 只寫模式
# 路徑不存在:路徑不存在自動建立
with open(r'b.txt', 'w', encoding='utf8') as f:
pass
# 路徑存在:1.會先清空檔案內容 2.再執行寫入操作
with open(r'a.txt', 'w', encoding='utf8') as f:
# f.read()
f.write('hello world!\n')
f.write('hello world!\n')
f.write('hello world!\n')
a 只追加模式(追加內容)
# 在檔案不存在時會建立空文件,檔案存在會將檔案指標直接移動到檔案末尾
with open('c.txt',mode='a',encoding='utf-8') as f:
f.write('123\n')