python day7

今日內容

字符編碼:

字符編碼針對的是文字,它只跟文本文件有關,這裏不須要考慮視頻、音頻文件等其餘文件。python

文本編輯器的輸入和輸出是兩個過程windows

  • 人在操做計算機的時候輸入的是人可以看懂的字符,可是計算機只能識別01010101這樣的二進制數據
  • 那麼人 輸入的字符 >>>(字符編碼表)>>> 二進制數字

字符編碼表就是字符與數字的對應關係編輯器

  • ASCII碼錶:用八位二進制表示一個英文字符,且全部的英文字符+符號最多也就在125位左右

  0000 0000工具

  1111 1111編碼

  • GBK編碼表:用2Bytes表示一箇中文字符,且用1Bytes表示一個英文字符

  0000 0000 0000 0000spa

  1111 1111 1111 1111 (最多能表示65535個字符)操作系統

基於上面的推導步驟,任何一個國家要想讓計算機支持本國語言,都必須本身建立一個字符編碼表。code

  • 萬國碼unicode:統一用2Bytes表示全部的字符

  a = 0000 0000 0010 1010orm

    1.浪費存儲空間視頻

    2.io次數增長,程序運行效率下降(致命缺點)

當內存中的unicode( unicode transformation format )編碼格式的數據存到硬盤時,會按照UTF-8編碼給你轉換。

  • UTF-8會將unicode的英文字符由原來的2Bytes變成1Bytes
  • UTF-8會將中文字符由原來的2Bytes變成3Bytes

現今的計算機:內存都是unicode、硬盤都是UTF-8

(須要掌握的)

unicode的兩個特色

  • 1.用戶在輸入的時候,不管輸入什麼字符都能兼容萬國字符
  • 2.其餘國家編碼的數據由硬盤讀到內存的時候,unicode與其餘各個國家的編碼都有對應關係

(必須掌握的)

數據由內存保存到硬盤

1.內存中的unicode二進制數字 >>>編碼(encode)>>> UTF-8格式的二進制數據

 硬盤中的數據由硬盤讀到內存

1.硬盤中的UTF-8格式的二進制數據 >>>解碼(decode)>>> 內存中unicode格式的二進制數據

 

亂碼:字符不可以正常顯示,由於編碼不一致

  • 保證不亂碼的關鍵在於:
  • 文本文件以什麼編碼編的就用什麼編碼解!!!

python2

  • 將py文件按照文本文件讀入解釋器中時默認使用ASCII碼(由於在開發python2解釋器時unicode尚未盛行)

python3

  • 將py文件按照文本文件讀入解釋器中時默認使用UTF-8

 

文件頭:

# coding:UTF-8

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 只讀模式
  • w 只寫模式
  • a 追加寫模式

 操做文件單位的方式:

  • t 文本文件,t在使用時須要指定encoding參數,若是不指定就默認是操做系統的默認編碼
  • b 二進制,必定不能指定encoding參數

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())  # 只讀取文件的一行內容

W模式

  • 1.文件不存在的狀況下,自動建立該文件
  • 2.當文件存在的狀況下,會先清空文件內容再寫入
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)

A 模式

  • 1.當文件不存在的狀況下,自動建立一個文件
  • 2.當文件存在的狀況下,不清空文件內容,文件的光標會移動到文件的最後
with open(r’copy_path’,‘a’,encoding=‘utf-8’) as f:

print(f.readable())  # False,是否可讀

print(f.writeable())  # True,是否可寫

f.write(‘XXXXX\n’)
相關文章
相關標籤/搜索