1. 程式人生 > >字元編碼 檔案處理

字元編碼 檔案處理

 

字元編碼
1、軟體啟動流程(開啟notepad++文件)
從硬碟將軟體載入到記憶體上
載入test.txt到記憶體中
執行notepad++的程式碼,將test.txt打到螢幕上

python直譯器也是一個應用軟體
從硬碟將軟體載入到記憶體上
載入test.py檔案讀到記憶體
直譯器解析python語法
文字編輯器與直譯器開啟檔案的前兩個階段的是一致的,僅第三個階段不同

什麼是字元編碼?字元編碼表
編碼:按照某種規範將資料轉換為二進位制
為什麼要編碼?
計算機只能識別0和1,那麼使用計算機就必須使用二進位制的方式告訴計算機
這是一個複雜的過程,所以需要一種解決的方法讓計算機識別人類的語言
字元編碼的發展史
1、美國使用Ascii編碼表
2、其他的國家也需要使用計算機,於是每個國家都推出自己的編碼表
中國-GBK
日本-shift-j
因為每個編碼表互補相容,導致亂碼
3、為了統一全世界產生Unicode編碼(萬國編碼)
1、統一全世界的編碼
2、必須還相容之前的GBK、shift-j編碼
Ascii:用八個二進位制位(一個位元組bytes)
1111 1111 2**8=255
GBK:英文字母在GBK中佔一個位元組
中文佔兩個位元組 16個二進位制位 2**16-1=65535
你Y好
1111 1111 1111 1111
如果一個位元組的首位為1,表示一箇中文
如果一個位元組的首位為0,表示一個英文
GBK 不僅僅要儲存資料,還要計算每個符號
unicode:無論是英文還是其他字元,都是兩個位元組
為什麼這麼設計
1、是為了提高效率,而採取的空間換時間
缺點:
2、浪費硬碟空間,降低網路傳輸效率
為了解決上述unicode退出UTF-8
utf-8是可變長的
英文佔一個位元組
中文佔三個位元組
與GBK相同的是,都需要計算存幾個位元組,所以不適合記憶體
使用與:硬碟和網路傳輸
結論:記憶體中用unicode,硬碟或網路傳輸中用utf-8
使用者駛入->記憶體(unicode)->轉換為(utf-8)->硬碟 該過程為編碼就是字元轉換為二進位制的過程
硬碟上的a.txt(utf-8的二進位制)-> unicode的二進位制-查編碼表得到符號--顯示到螢幕上
該過程稱之為解碼,把二進位制轉化為符號
亂碼問題?
1、儲存是與取出時使用的編碼不一致,只要找到正確的編碼資料還可以恢復
2、存的時候就已經亂了(文件中的內容超出了採用的編碼表的範圍),資料將丟失解決方法是用utf-8編碼表
如何解決檔案亂碼問題
python在執行程式碼之前必須從硬碟載入到記憶體,硬碟中都是二進位制,必須要用UNICODE編碼表
name直譯器怎麼知道你採用的什麼編碼方式?
如果不明確自定,直譯器將採用預設的解碼方式,在python3中預設的是UTF-8字元編碼,在python2中預設的ASCII碼
當你使用pathon中則需要手動指定編碼方式 設定檔案頭 #coding:utf-8
name=u'張全蛋‘
#u 表示將這個變數儲存為unicode 編碼,可以防止取出變數時亂碼
1個16進位制=0.5個位元組

encode unicode =>utf-8 將Unicode的字元轉化為二進位制
decode utf-8 ->unicode 將二進位制轉化為Unicode


檔案處理:
檔案是什麼?
檔案是作業系統提供的虛擬概念
檔案這個概念的自所以出現是為了簡化對硬碟的操作
學習檔案處理是為了將資料永久儲存

1、開啟檔案
f=open('test.txt,encoding='utf-8))#是給作業系統一個指令,讓作業系統去開啟檔案,應為應用程式無法直接控制硬碟
2、讀取內容
data=f.read()
print(data)

# 使用迴圈 來讀取全部內容 方式1
# with open(r"D:\sh_fullstack_s6\day8\程式碼\test.txt",mode="r",encoding="utf-8") as f:
# while True:
# line = f.readline()
# if not line: # 如果line為空則表示沒有內容了
# print("\n沒有內容啦!")
# break
# print(line,end="")

# 使用迴圈 來讀取全部內容 方式2
# with open(r"D:\sh_fullstack_s6\day8\程式碼\test.txt",mode="r",encoding="utf-8") as f:
# for line in f:
# print(line,end="")

# 一次性讀取全部
# with open(r"D:\sh_fullstack_s6\day8\程式碼\test.txt",mode="r",encoding="utf-8") as f:
# print(f.readlines()) # 會將每一行放入列表中


3、關閉檔案
f.close()
總結:open read close 等都是在給作業系統傳送指令
開啟檔案的語法二:在with 程式碼執行完畢後會自動呼叫close
with open('test.txt') as f:
data=f.read()


引數1 檔案路徑 可以相對,也可以是絕對
mode 開啟檔案的模式 r(只讀)
w(只寫)

# 注意在w模式下 一旦開啟檔案 立即清空原來的內容 如果檔案不存在則建立新檔案
# 寫入字串時需要手動拼接換行符
with open(r"D:\sh_fullstack_s6\day8\程式碼\test.txt",mode="w",encoding="utf-8") as f:
f.write("愛根\n")
print(f.writable())
f.writelines("\n".join(["abc","cba","nba"]))
# f.writelines({"name":"bgon","age":20})
pass



#
with open("新檔案.txt",mode="w")as f:
pass


+(可讀可寫)瞭解即可

+ 表示可讀可寫模式
w+ 清空原檔案,如果不存在則建立
r+ 如果不存在則報錯
a+ 如果不存在則建立,游標移動到最後
可讀可寫:可用於文字處理,但對於寫別的檔案,一般不用,容易造成檔案的破壞打不開
Windows預設
讀取內容:可以用引數指定要讀取的個數,預設為-1表示全部讀取
需要注意read(-1)僅限於檔案較小時,如果記憶體過大會造成記憶體溢位
data=f.read(2000)

讀取相關函式
read()讀取全部
read(size)讀取指定大小
readlines ()讀取全部
readline()讀一行
readable()判斷是否可讀

注意在w模式寫,一旦開啟檔案 立即清空原來的檔案,如果檔案不存在則建立一個新檔案 

在操作非文字檔案時,(讀一個圖片)必須明確指定模式為位元組模式
b 用來指定為位元組模式
b必須與r/w連用 rb/wb
注意、
b必須與r/w連用 rb/wb
當模式為位元組模式時,不能指定encoding引數
預設情況下,讀寫文字模式,也就是t模式,同樣需要與r/w連用

t模式下python直譯器會自動轉碼解碼而b模式不會

當模式為位元組模式時單位為位元組

在b模式下只能寫入位元組

print(data)
f.close()
print(f.readable())判斷是否可讀
print(f.wrireable())判斷是否可寫

a表示追加寫入模式,不會清空原資料,會自動把游標移到最後
with open (r'檔案路徑’,‘at’(文件模式)/'ab'(b模式),encoding='utf-8')

控制檔案的開啟模式
r\w\a\+
控制操作檔案內容的模式
t\b

t\b必須與開啟模式連用
各種組合如下:
rt、wt、at、rb、wb、ab、r+、w+、a+

關於檔案操作的常用函式
read
readline
readlines
readable

write
writelines
writeable

關於編碼的兩個函式
encode 編碼
decode 解碼