python字元編碼與檔案操作
字元編碼
字元編碼是什麼
人與計算機互動時,使用的都是人類能夠讀懂的語言,而計算機只能理解0和1兩個數字的組合,字元編碼就是相當於將人類能夠理解的語言翻譯成計算機能夠理解的數字。
字元編碼的發展史
字元編碼大概可以分為三個階段。
-
階段一:一家獨大
計算機是由美國人,所以一開始只有他們的字元編碼,只記錄了英文字元和數字的對應關係,也就是ASCII碼,用1bytes來表示一個英文字元。
記憶點:ASCII碼中A-Z對應65-90,a-z對應97-122
-
階段二:群雄割據
計算機傳到其他國家後,其他國家使用計算機時發現ASCII對於有些語言來說不好使,於是各個國家發明了各自的字元編碼。
中國發明的是GBK編碼,用1bytes儲存英文,2bytes儲存中文。
-
階段三:天下一統
由於各個國家各自的字元編碼不同,不同國家之間在傳輸資訊的時候就會出現亂碼的情況,於是就發明了萬國碼(Unicode),但是它所有的字元都是2bytes起步儲存,會浪費空間和輸入輸出時間。
字元編碼實際應用
編碼與解碼
-
編碼(encode)
將人類能夠讀懂的字元翻譯成計算機能夠讀懂的字元
# 編碼 print('我是帥比'.encode('gbk')) # 輸出結果:b'\xce\xd2\xca\xc7\xcb\xa7\xb1\xc8'
-
解碼(decode)
將計算機能夠讀懂的字元翻譯成人類能夠讀懂的字元
# 編碼
res = '我是帥比'.encode('gbk')
# 解碼
print(res.decode('gbk'))
# 輸出結果:我是帥比
亂碼問題
當一組資料用不同的字元編碼進行編碼解碼時,就會出現亂碼的情況。
# 編碼
res = '我是帥比'.encode('utf8')
# 解碼
print(res.decode('gbk'))
# 輸出結果:鎴戞槸甯呮瘮
為了防止亂碼的情況,我要用什麼進行編碼時就要用什麼來進行解碼。
python直譯器層面
python2直譯器預設的編碼是ASCII碼,所以為了python直譯器可以識別中文和其他語言,我們在使用python2時一般會進行2個操作。
-
在程式碼的最上方新增一段註釋
# coding:utf8 或者 # -*- coding:utf8 -*-
-
在定義字串時習慣在前面加u
name = u'張三'
檔案操作
檔案操作簡介
檔案
檔案是作業系統暴露給使用者可以直接操作硬碟的快捷方式。
用程式碼進行檔案操作的流程
用程式碼進行檔案操作有四個步驟:
- 開啟檔案或是建立檔案
- 編輯檔案內容
- 儲存檔案內容
- 關閉檔案
基本語法結構
# 用python操作檔案有2中語法
# 第一種(不推薦)
f1 = open(檔案路徑,模式,編碼型別)
f1 = close()
# 第二種(推薦),f是變數名
with open(檔案路徑,模式,編碼型別) as f:
pass
"""
使用第一種是需要手動寫關閉檔案的程式碼
而第二種方法會在執行完子程式碼後自動關閉檔案
"""
補充
在填寫路徑的時候我們會用到反斜槓符號,為了防止轉義,我們會在路徑前面加上一個英文字母r
檔案的內建方法
資料型別有它的內建方法,檔案當然也有。
read() # 一次性讀取檔案的全部內容 ps:檔案過大易記憶體溢位
readline() # 一次只讀一行內容
readlines() # 將檔案一行行的內容儲存到列表中
readable() # 判斷檔案是否可讀
write() # 將內容寫到檔案中
writelines() # 將列表中的多個元素寫到檔案中
writable() # 判斷檔案是否可寫
flush() # 將檔案儲存一下
補充:檔案還支援for迴圈,可以一行行讀取內容,記憶體中同一時刻只會有一行內容,有效防止記憶體溢位。
檔案的讀寫模式
python對於文字的操作模式有三種:只讀模式(r)、只寫模式(w)、只追加模式(a)。
- 只讀模式(r模式)
# 路徑不存在時,會直接報錯
with open(r'a.txt', 'r', encoding='utf8') as f1:
pass
# 路徑存在時,正常開啟檔案並等待內容讀取
with open(r'a.txt', 'r', encoding='utf8') as f1:
pass
# 注意:r模式只能讀取,不能寫入,不然會報錯
- 只寫模式(w模式)
# 路徑不存在時,會自動建立檔案
with open(r'a.txt', 'w', encoding='utf8') as f1:
pass
# 路徑存在時,會先清空檔案內容,之後在寫入資料
with open(r'a.txt', 'w', encoding='utf8') as f1:
f1.write('這是第一行\n')
f1.write('這是第二行\n')
f1.write('這是第三行\n')
- 只追加模式(a模式)
# 只追加模式和只寫模式基本一致
# 唯一的區別就是檔案存在時它不會清空資料在新增內容,而是會在內容末尾新增內容
with open(r'a.txt', 'a', encoding='utf8') as f1:
f1.write('這是追加內容')
檔案的操作模式
檔案的操作模式有兩種t模式和b模式。
-
t模式是預設的模式,在讀寫模式中,它的t被省略了,完整的寫的話應該是'rt'、'wt'、'at'。
注意事項:
- 只能操作文字檔案
- 必須指定encoding引數
- 該模式讀寫都是以字串為最小單位
-
b模式也稱二進位制模式,是可以操作任意型別的檔案的。
注意事項:
- 不需要指定encoding引數
- 可以操作任意型別的檔案
- 該模式讀寫都是以bytes型別為最小單位
# b模式讀取圖片資訊
with open('1.jpg', 'rb') as f1:
print(f1.read())
作業
- 編寫一個簡易版本的拷貝程式,路徑全部自定義
- 結合檔案編寫使用者註冊登入功能,提前先建立一個空的userinfo.txt,使用者註冊資料儲存到檔案中,使用者登入 資料來源於檔案
- 必要要求
單使用者註冊登入 - 拔高練習
多使用者註冊登入
- 必要要求