編碼的進階
不同編碼之間的010101是不能相互識別的
網路傳輸,資料儲存到磁碟 使用的010101這種二進位制,不能使用Unicode編碼本去編譯 佔用位元組數太多 佔空間 佔流量
大背景:python3x版本
str:它在記憶體中的編碼方式:Unicode
但寫入檔案的內容 傳輸別人的資料 一般都是str
矛盾: 傳輸 儲存不能用Unicode 但python3x又要用str操作
所以利用str傳送或傳輸時 ...程式碼... (轉換 將Unicode便把轉為非Unicode)
bytes: 一種資料型別 與str幾乎一模一樣 表現形式 str:'taibai' bytes:b'taibai'
與str差別: str在記憶體中的編碼:Unicode bytes編碼是非Unicode
中文:str 表現形式為'中國'
bytes : b'\xe4\xb8\xad\xe5\x96\xbq
str ---> utf-8 bytes
s1 = '太白'
b1 = s1.encode('utf-8')
print(b1)
終極轉換
GB 2312 UTF-16
Unicode
utf-8 gbk
utf-8轉化為gbk
s2 = s1.decode('utf-8') 轉為Unicode 再轉為 s2.encode('gbk')
檔案操作的初識
想開啟一個檔案需要三要素:
檔案路徑:path
編碼方式:utf-8 gbk 等
具體的操作:讀 寫 讀寫 寫讀等
f = .open('路徑格式',encoding='編碼方式',mode='操作')
print(f.read())
f.close()
開啟檔案第二種辦法:
with open('檔案路徑',encoding='編碼型別',mode='操作型別')as f1
好處是省去了寫f.close()
缺點是如果同時操作兩個控制程式碼,可能會因為第一個沒來得及關閉就去操作下一個,導致第一個沒有close,會報錯
f 是變數 是檔案控制程式碼
open()是python的內建函式
Windows:預設編碼 gbk Linux ms:預設編碼utf-8
操作檔案流程:
1.開啟檔案,產生一個檔案控制程式碼
2.對檔案控制程式碼進行相應的操作
3.關閉檔案控制程式碼
可能出現的問題:
路徑問題
\與後面內容構成命令 多加一個\
編碼問題
編碼要與檔案儲存時的編碼保持一致
錯誤
有的電腦會隱藏檔案字尾名 可設定顯示字尾名
檔案的讀
有四種模式 r r+ rb r+b
四種模式下,還有五種讀檔案的不同方式
r 在同一個資料夾下,是相對路徑 可以直接寫檔名而不用寫路徑
f1 = open('檔案路徑',encoding='編碼方式') 如果進行讀的操作,就不用加mode操作方式
print(fi.read())
f1.close() 全部讀取,讀取出來的資料型別是str
在r模式中 n代表字元
f1 = open('檔案路徑',encoding='編碼方式')
print(f1.read(3))
f1.close() 按字元讀取
print(f1.readline()) 按行讀取,寫幾行這個程式碼,就讀取幾行
print(f1.readlines()) 會返回給出一個列表 列表的每一個元素就是原檔案的每一行
以上四種操作只能操作小檔案 大檔案全部讀取的話會佔用記憶體,導致計算機崩潰
迴圈讀取:
f1 = open('檔案路徑',encoding='編碼方式')
for line in f1:
print(line)
f1.close() 每次只輸出一行 輸出一行之後取輸出下一行 不佔用記憶體
rb
以位元組的形式讀取 帶b的一般操作的都是非文字類的檔案(圖片,視訊等)
f1 = open('檔案路徑',encoding='編碼方式',mode='rb')
print(f1.read())
f.close() 獲得檔案位元組
檔案的寫
分為w w+ wb w+b
只有一種模式:全部寫入
f1 = open('檔案路徑',encoding='編碼方式',mode='w')
f.write('寫內容')
f.close() 如果沒有檔案 就建立一個檔案 並寫入內容
f1 = open('檔案路徑',encoding='編碼方式',mode='w')
f.write('新內容')
f,close() 如果有檔案,先清空,後寫入 檔案沒有close的時候,write多少就寫入多少
wb
f1 = open('檔案路徑',encoding='編碼方式',mode='rb')
content=f1.read() 把圖片讀取出來
f1.close()
f2 = open('新檔案路徑',encoding='編碼方式',mode='wb')
f2.write(content) 建立一個新檔案,將原檔案程式碼寫入
f2.close()
檔案的追加
共有四種 a ab a+ a+b
f = open('檔案路徑',encoding='編碼方式',mode='a')
f.write('內容') 沒有檔案 建立檔案 寫入內容 有檔案 追加內容至末尾
f.close()
r+ 讀寫 先讀後寫
f1 = open('檔案路徑',encoding='編碼方式',mode='r+')
content=f1.read()
print(content)
f1.write('666')
f1.close()
其他操作
readable 判斷檔案是否可讀
writable 判斷檔案是否可寫
游標預設位置在檔案最開始
f1 = open('檔案路徑',encoding='編碼方式)
f1.seek(int) 按照位元組調整游標位置
print(f1.tell(1)) 獲取游標位置
f1.close()
truncate 對原檔案進行擷取 ,必須在可寫狀態下使用 游標調整對他無用 只能從頭開始 操作方式必須是r+
檔案的改
1.以讀的方式開啟原檔案
2.以寫的方式建立一個新檔案
3.將原檔案的內容讀取出來 按照你的要求改成新內容 寫入新檔案
4.刪除原檔案
5.將新檔案重新命名為原檔案
import os 輔助模組 幫助刪除
1.2步
with open('檔案路徑',encoding='編碼方式)as f1,\
open('檔案路徑',encoding='編碼方式',mode='w')as f2:
3
old_content=f1.read()
new_content= old_content.replace('舊','新')
f2.write(new_content)
4
os.remove('原檔案')
5
os.rename('新檔案','原檔案')
這種方式read全部讀取 佔用記憶體太大 因此可以分行讀取處理
with open('檔案路徑',encoding='編碼方式)as f1,\
open('檔案路徑',encoding='編碼方式',mode='w')as f2:
for old_line in f1:
new_line=old_line.replace('舊','新')
f2.write(new_line)
os.remove('原檔案')
os.rename('新檔案','原檔案')
深淺copy
淺copy
以列表舉例 dict set 也可以copy
copy 複製 但不能完全複製
l1 = [1,2,3,[1,2]]
l2=l1.copy()
只是copy了一個外殼 相當於開闢一個新空間裝列表 但沒有內容 內容用的還是l1 共用一個
給l1新增一個元素 l2不變 但給l1【-1】新增一個元素 l2也跟著新增一個元素
l1 l2 id不同 但包含的內容的id相同 無論在不在一個程式碼塊 都是共用一個
深copy import copy
l1 = [1,2,3,[1,2]]
l2=l1.copy()
l1[0] l2[0] id相同
l1[-1] l2[-1] id不同
不可變的資料型別共用一份 可變的資料型別l2重新建立一份
深copy不僅複製建立一個新外殼,外殼裡面可變資料型別也建立一份新的 但不可變得資料型別就共用一個