編碼進階
"""
Python3中有兩種數據類型(注意是數據類型而不是編碼方式):str和bytes。str類型存儲unicode數據,用於向人展現數據,既咱們所說的明文。bytes類型用於存儲字節數據,用於計算機存儲和傳輸
"""
# s1 = '中國' # str類型用於向人類展現,計算機不認識,想要存儲和網絡傳輸必須先將str轉化成bytes類型; # s2 = s1.encode('utf-8') # utf-8中轉化成bytes類型,一箇中文==3bytes; # print(s2) # 用什麼編碼的就用什麼解碼 # s3 = s2.decode('utf-8') # print(s3) # 同理GBK編碼也是 # ------------------------ # gbk與utf-8的轉換 # utf-8<---->unicode<---->gbk s1 = '中國' # 首先將字符串編碼成bytes類型才能傳輸 a = s1.encode('utf-8') # 發送bytes類型 # 接收者首先須要將a解碼成unicode編碼(萬國碼) a1 = a.decode('utf-8') # 在編碼成gbk格式用於存儲 a2 = s1.encode('gbk') # 解碼gbk查看 a3 = a2.decode('gbk') print(a3)
複製代碼 編碼進階: # str -----> utf-8 bytes a = '中國' b = a.encode('utf-8') print(b) # b'\xe4\xb8\xad\xe5\x9b\xbd' # str -----> gbk bytes c = a.encode('gbk') print(c) # b'\xd6\xd0\xb9\xfa' # utf-8 bytes ------> str uniconde demo = b'\xe4\xb8\xad\xe5\x9b\xbd' str_l = demo.decode('utf-8') print(str_l) # gbk bytes ------> str uniconde demo1 = b'\xd6\xd0\xb9\xfa' str_2 = demo1.decode('gbk') print(str_2) # 終極轉換 utf-8 ------> gbk 二者之間的轉換必須經過萬國碼(unicode) t = b'\xe4\xb8\xad\xe5\x9b\xbd' # 先將utf-8編碼轉換成unicode y = t.decode('utf-8') # 在將y編碼成gbk u= y.encode('gbk') print(u) 複製代碼
文件操做
文件操做:
#1. 打開文件的模式有(默認爲文本模式):
r ,只讀模式【默認模式,文件必須存在,不存在則拋出異常】
w,只寫模式【不可讀;不存在則建立;存在則清空內容】
a, 只追加寫模式【不可讀;不存在則建立;存在則只追加內容】
#2. 對於非文本文件,咱們只能使用b模式,"b"表示以字節的方式操做(而全部文件也都是以字節的形式存儲的,使用這種模式無需考慮文本文件的字符編碼、圖片文件的jgp格式、視頻文件的avi格式)
rb
wb
ab
注:以b方式打開時,讀取到的內容是字節類型,寫入時也須要提供字節類型,不能指定編碼
#3,‘+’模式(就是增長了一個功能)
r+, 讀寫【可讀,可寫】
w+,寫讀【可寫,可讀】
a+, 寫讀【可寫,可讀】
#4,以bytes類型操做的讀寫,寫讀,寫讀模式
r+b, 讀寫【可讀,可寫】
w+b,寫讀【可寫,可讀】
a+b, 寫讀【可寫,可讀】
r+ 讀寫模式:先讀後寫
rb 以字節的形式讀取,帶b的通常操做的都是非文字類的文件.
read:讀取所有內容(文件較大時不可用,用for循環讀取)
r模式:read(n)----n表明讀取第幾個字符
rb模式:read(n)---n表明讀取第幾個字節
其他的文件內光標移動都是以字節爲單位的如:seek,tell,truncate
readlien:讀取第一行
readliens:返回一個list 列表的每一個元素是源文件的每一行.
重點:seek光標移動(按字節移動)中文3個字節,英文一個字節,換行(\n)是2個字節;
seek(0,0)把光標移到起始位置
seek(0,1)當前光標所在位置
seek(0,2)把光標移到結束位置
r模式:read(n)----n表明讀取第幾個字符,只有r模式n表明字符,其餘都是按字節讀取
1. seek有三種移動方式0,1,2,其中1和2必須在b模式下進行,但不管哪一種模式,都是以bytes爲單位移動的
2. truncate是截斷文件,因此文件的打開方式必須可寫,可是不能用w或w+等方式打開,由於那樣直接清空文件了,因此truncate要在r+或a或a+等模式下測試效果。
經常使用操做: def close(self, *args, **kwargs): # real signature unknown 關閉文件 pass def fileno(self, *args, **kwargs): # real signature unknown 文件描述符 pass def flush(self, *args, **kwargs): # real signature unknown 刷新文件內部緩衝區 pass def isatty(self, *args, **kwargs): # real signature unknown 判斷文件是不是贊成tty設備 pass def read(self, *args, **kwargs): # real signature unknown 讀取指定字節數據 pass def readable(self, *args, **kwargs): # real signature unknown 是否可讀 pass def readline(self, *args, **kwargs): # real signature unknown 僅讀取一行數據 pass def seek(self, *args, **kwargs): # real signature unknown 指定文件中指針位置 pass def seekable(self, *args, **kwargs): # real signature unknown 指針是否可操做 pass def tell(self, *args, **kwargs): # real signature unknown 獲取指針位置 pass def truncate(self, *args, **kwargs): # real signature unknown 截斷數據,僅保留指定以前數據 pass def writable(self, *args, **kwargs): # real signature unknown 是否可寫 pass def write(self, *args, **kwargs): # real signature unknown 寫內容 pass 複製代碼
文件的修改
文件的數據是存放於硬盤上的,於是只存在覆蓋、不存在修改這麼一說,咱們平時看到的修改文件,都是模擬出來的效果,具體的說有兩種實現方式:html
方式一:將硬盤存放的該文件的內容所有加載到內存,在內存中是能夠修改的,修改完畢後,再由內存覆蓋到硬盤(word,vim,nodpad++等編輯器)python
import os # 調用系統模塊 with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: data=read_f.read() #所有讀入內存,若是文件很大,會很卡 data=data.replace('alex','SB') #在內存中完成修改 write_f.write(data) #一次性寫入新文件 os.remove('a.txt') #刪除原文件 os.rename('.a.txt.swap','a.txt') #將新建的文件重命名爲原文
方式二:將硬盤存放的該文件的內容一行一行地讀入內存,修改完畢就寫入新文件,最後用新文件覆蓋源文件vim
import os with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: for line in read_f: line=line.replace('alex','SB') write_f.write(line) os.remove('a.txt') os.rename('.a.txt.swap','a.txt')
練習:網絡
1. 文件a.txt內容:每一行內容分別爲商品名字,價錢,個數。app
apple 10 3編輯器
tesla 100000 1ide
mac 3000 2post
lenovo 30000 3測試
chicken 10 3編碼
經過代碼,將其構建成這種數據類型:[{'name':'apple','price':10,'amount':3},{'name':'tesla','price':1000000,'amount':1}......] 並計算出總價錢。
2,有以下文件:
-------
alex是老男孩python發起人,建立人。
alex實際上是人妖。
誰說alex是sb?
大家真逗,alex再牛逼,也掩飾不住資深屌絲的氣質。
----------
將文件中全部的alex都替換成大寫的SB。