1、字符編碼python
字符編碼針對的是文字,字符編碼只跟文本有關,這裏不須要考慮視頻、音頻等其餘文件。windows
人在操做計算機的時候輸入的是人能看懂的字符,可是計算機只能識別010101這樣的二進制數據,那麼就須要用字符編碼表來處理字符與數字的對應關係。編碼
最先的是ASCII表,用八位二進制表示一個英文字符,可是它只能表示英文和一些符號,不適合中文。因此中國本身出了一個GBK編碼格式,用2Bytes表示一箇中文字符。基於上面的推導,每一個國家的文字都不同,那麼用的編碼格式也不同,若是要相互使用就很方便。因此出了一個萬國碼unicode,統一用2Bytes表示全部字符。spa
unicode有兩個特色:1.由於全部字符都是用2Bytes表示字符,因此會浪費不少存儲空間。2.io次數增長,程序運行效率下降(這個是致命的)操作系統
後面針對這兩個特色進行修改:當內存中的unicode編碼格式數據存在硬盤的時候,會按照utf-8編碼。將unicode的英文字符由原來的2Bytes變成1Bytes。將unicode中文字符由原來的2Bytes變成3Bytes。code
如今的計算機:視頻
內存是unicode對象
硬盤是utf-8blog
須要掌握的:內存
unicode的兩個特色:
1.在用戶輸入的時候,不管輸入什麼字符都可以兼容萬國字符
2.其餘國家編碼的數據由硬盤讀到內存的時候unicode與其餘國家的編碼都有對應的關係。
數據由內存存到硬盤:
1.內存中的unicode格式二進制數據 >>>經過編碼(encode)>>> 硬盤中utf-8格式的二進制數據
2.硬盤中utf-8格式的二進制數據 >>>經過解碼(decode)>>> 內存中unicode格式的二進制數據
咱們要清楚文件爲何會亂碼:由於文件存的格式和讀取的格式不同(******)
x = '上' #第一種方法: # res1 = bytes(x,encoding='utf-8') # print(res1,type(res1)) # res2 = str(res1,encoding='utf-8') # print(res2,type(res2)) #第二種方法 res = x.encode('utf-8') print(res) #b'\xe4\xb8\x8a' print(type(res)) #<class 'bytes'> print(res.decode('utf-8')) #上
這裏有個python2和python3的不一樣點:
python2:將py文件按照文本文件讀入解釋器默認使用ASCII碼
python3:將py文件按照文本文件讀入解釋器中默認使用utf-8
文件頭:# coding:utf-8 在py文件開頭寫這個文件頭,編碼格式會自動轉爲這個
補充:1.pycharm終端使用的是utf-8格式
2.windows終端採用的是gbk
字符編碼總結:
咱們用代碼來舉例:
x = '上'
res1 = x.encode('utf-8') #將unicode編碼變成能夠存儲和運輸的utf-8的二進制數據
res2 = res1.decode('utf-8') #將硬盤中utf-8格式的二進制數據解碼成unicode格式的二進制數據
2、文件操做
文件處理包括三個步驟: 打開(open) /讀寫(read,write)/ 關閉(close)
# 經過python代碼操做文件 # r取消轉義 f = open(r'D:\Python項目\day07\a.txt',encoding='utf-8') # 向操做系統發送請求 打開某個文件 # 應用程序要想操做計算機硬件 必須經過操做系統來簡介的操做 print(f) # f是文件對象 print(f.read()) # windows操做系統默認的編碼是gbk f.read() # 向操做系統發請求 讀取文件內容 f.close() # 告訴操做系統 關閉打開的文件
用open打開的文件必定要記得寫close關閉
上面的這種操做方法比較複雜,因此出了文件上下文操做
with open 的方法,這個用法不用寫close,還能夠同時打開幾個文件。
with open(r'D:\Python項目\day07\a.txt',encoding='utf-8') as f ,\ open(r'D:\Python項目\day07\b.txt',encoding='utf-8') as f1: # f僅僅是一個變量名 你把它當作是一個遙控器 print(f) print(f.read()) print(f1) print(f1.read())
文件打開模式:
r 只讀模式 默認的模式
w 只寫模式
a 追加寫模式
操做文件單位的方式:
t 文本文件 默認的,能夠不用寫,在操做文本文件的時候,必定要指定encoding參數,若是不添加encoding參數默認是操做系統的默認編碼(gbk)
b 二進制數據文件(好比視頻,音頻文件) 若是用了這個就不要寫encoding參數
r 只讀模式
r模式在打開文件的時候,若是文件不存在直接報錯
有三種讀取方式:read,readline,readlines
read:一次性將文件所有讀取,返回的數據是字符串格式,缺點是若是文件太大,會佔滿內存
readline:讀取文件內容的一行,返回的數據也是字符串格式
readlines:每一行每一行的讀,每一行當成一個字符串,全部數據放在一個大列表當中
#讀取文本文件用rt with open(r'D:\Python項目\day07\a.txt',mode='rt',encoding='utf-8') as f: print(f.readable()) # 是否可讀 print(f.writable()) # 是否可寫 print(f.read()) # 一次性將文件內容所有讀出
for i in f: #f能夠被for循環 每for循環一次,就讀取一行內容
print(i) #這個方法能夠解決一次性讀取文件佔用內存過大的問題
#讀取二進制文件用rb with open(r'D:\Python項目\day07\1.jpeg',mode='rb') as f: print(f.readable()) # 是否可讀 print(f.writable()) # 是否可寫 print(f.read()) # 一次性將文件內容所有讀出 print(f.read()) # 讀完一次以後 文件的光標已經在文件末尾了,再讀就沒有內容了可讀 print(f.readlines()) # 返回的是一個列表 列表中的一個個元素對應的就是文件的一行行內容
w 只寫模式(這個模式要慎用,若是文件自己有內容的話,寫入的時候會被清空)
1.當文件不存在的時候,會自動建立文件
2.當文件存在的時候,先清空文件內容,而後再寫入
有三種寫入方式:write/writeline/writelines
with open(r'xxx.txt',mode='w',encoding='utf-8') as f: print(f.readable()) # 是否可讀 print(f.writable()) # 是否可寫 f.write('不不不,你沒有翻~\n') f.write('不不不,你沒有翻~\n') f.write('不不不,你沒有翻~\n') f.write('不不不,你沒有翻~\r') f.write('不不不,你沒有翻~') l = ['不sdffs,sdfs有翻~\n','不sdfsdf不,你sdfsf翻~\n','不sfad不,你沒sa翻~\n'] f.writelines(l) # 上下等價 for i in l: f.write(i)
a 追加模式
1.在文件不存在的狀況下,自動建立文件
2.當文件存在的狀況下,不清空文件內容,文件光標會移動到文件的最後,在原有的基礎上追加
a模式不可讀,只能寫
with open(r'yyy.txt',mode='a',encoding='utf-8') as f: print(f.readable()) # 是否可讀 False print(f.writable()) # 是否可寫 True f.write('我是小尾巴\n')
具體的詳細內容能夠參考:http://note.youdao.com/noteshare?id=17303322fcbc09a85d9bd5195dec25ae&sub=F9D47851E02B4CB7A341119637EC6BAE