字符編碼針對的是文字,它只跟文本文件有關,這裏不須要考慮視頻、音頻文件等其餘文件。python
文本編輯器的輸入和輸出是兩個過程windows
字符編碼表就是字符與數字的對應關係編輯器
0000 0000工具
1111 1111編碼
0000 0000 0000 0000spa
1111 1111 1111 1111 (最多能表示65535個字符)操作系統
基於上面的推導步驟,任何一個國家要想讓計算機支持本國語言,都必須本身建立一個字符編碼表。code
a = 0000 0000 0010 1010orm
1.浪費存儲空間視頻
2.io次數增長,程序運行效率下降(致命缺點)
當內存中的unicode( unicode transformation format )編碼格式的數據存到硬盤時,會按照UTF-8編碼給你轉換。
現今的計算機:內存都是unicode、硬盤都是UTF-8
unicode的兩個特色
數據由內存保存到硬盤
1.內存中的unicode二進制數字 >>>編碼(encode)>>> UTF-8格式的二進制數據
硬盤中的數據由硬盤讀到內存
1.硬盤中的UTF-8格式的二進制數據 >>>解碼(decode)>>> 內存中unicode格式的二進制數據
亂碼:字符不可以正常顯示,由於編碼不一致
python2
python3
文件頭:
1.由於全部的編碼文件都支持英文字符,因此文件頭纔可以正常生效
基於Python解釋器開發的軟件,只要是中文,前面都須要加一個u,爲的就是將python2(當你不指定文件頭的時候,默認用ASCII碼存儲數據,若是指定文件頭就按照指定的編碼格式存儲)存儲爲unicode編碼文件。
python3中字符串默認就是unicode格式
補充:
1.pycharm終端用的是UTF-8格式
2.windows終端cmd用的是GBK格式
八位二進制也叫8bit
8bit = 1Bytes
1024Bytes = 1KB
1024KB = 1MB
1024MB = 1GB
1024GB = 1TB
1024TB = 1PB
......
x = ‘上’ print(x.encode(‘utf-8’)) # b’\xe4\xb8\x8a’ # bytes類型 字節串類型,咱們把它當成二進制數據便可
x = ‘上’ res1 = x.encode(‘utf-8’) # 將unicode編碼成能夠存儲和傳輸的utf-8格式的二進制數據 print(res1) # b’\xe4\xb8\x8a’ res2 = res1.decode(‘utf-8’) #將硬盤中的utf-8格式的二進制數據解碼成unicode格式的二進制數據 print(res2)
例如:你a他
1Bytes|1Bytes|1Bytes|1Bytes|1Bytes|1Bytes|1Bytes
1+7bit|1+7bit|1+7bit|1+7bit|1+7bit|1+7bit|1+7bit|
其中1Bytes裏由標識符顯示如何分配的信息
什麼是文件?
操做系統提供給用戶操做複雜硬件(硬盤)的簡易接口。
爲何要操做文件?
人或者應用程序須要永久的保存數據。
如何進行文件處理?
經過python代碼操做文件:
f = open(r‘copy_path便可’) #向操做系統發送請求,打開某個文件 # 裏面的r是real取消轉義,指的是原先的字符串 # 應用程序要想操做計算機硬件,必須經過操做系統來間接的操做 print(f) # f是文件對象 print(f.read()) #報錯,由於windows操做系統默認的編碼是GBK f = open(r‘copy_path便可’,encoding=‘utf-8’) print(f.read()) f.read() #向操做系統發請求,讀取文件內容 f.close() #向操做系統發送請求,關閉打開的文件 print(f.read()) #報錯,顯示I/O operation on closed file
文件上下文操做:
with open(r’copy_path’,encoding=‘utf-8’) as f ,\ open(r’copy_path’,encoding=‘utf-8’) as f1: # f僅僅是個變量名,它只是個操做工具 print(f) print(f.read()) print(f1) print(f1.read())
文件打開模式:
操做文件單位的方式:
r模式
# mode參數能夠不寫,不寫時默認時rt----只讀的文本文件,這個t不寫時默認就是t with open(r’copy_path’,mode=‘r’,encoding=‘utf-8’) as f: print(f.readable()) # False,是否可讀 print(f.writeable()) # True,是否可寫 print(f.read()) # 一次性將文件內容所有讀出 print(f.write()) # 一次性將文件內容所有寫出 with open(r’copy_path’,mode=‘rb’) as f: print(f.readable()) # False,是否可讀 print(f.writeable()) # True,是否可寫 print(f.read()) # 一次性將文件內容所有讀出
# r模式在打開文件時,若是文件不存在,直接報錯 # 文件路徑能夠寫相對路徑,可是須要注意該文件必須與執行文件在同一層文件下 with open(r’XXX’,‘rb’,encoding=‘utf-8’) as f: print(‘>>>1:’) print(f.read()) print(‘>>>2:’) print(f.read()) '''>>>1: XXXXXX XXXXXX >>>2: '''
# 讀完一次以後,文件的光標已經在文件末尾了,再讀就沒有內容可讀了 print(f.readlines()) # 返回的是一個列表,列表中的一個個元素對應的就是文件的執行內容 for i in f: # f能夠被for循環,每for循環一次,讀一行內容 print(i) # 這個方法能夠解決大文件一次性讀取佔用內存太高的問題 print(f.readline()) # 只讀取文件的一行內容
with open(r’copy_path’,‘w’,encoding=‘utf-8’) as f: print(f.readable()) # False,是否可讀 print(f.writeable()) # True,是否可寫 f.write(‘今天XXXXX\r\n’) # 用\r\n會換行兩次 f.write(‘今天XXXXX\n’) # 用\n或者\r只會換行一次 l = [‘XXX,XXX\n’,‘XXX,XXX\n’] f.writelines() # 能夠寫多行,上下文等價 for i in l: f.write(i)
with open(r’copy_path’,‘a’,encoding=‘utf-8’) as f: print(f.readable()) # False,是否可讀 print(f.writeable()) # True,是否可寫 f.write(‘XXXXX\n’)