1. 程式人生 > >06 Python字符編碼與文件處理

06 Python字符編碼與文件處理

-- 返回 計算機 mode 讀寫文件 數字 參數 euc 清空文件

python垃圾回收機制:

python中的垃圾回收機制是以引用計數為主,分代收集為輔,引用計數的缺陷是循環引用的問題,一個對象的引用數為0 ,那麽這個對象就會被python虛擬機回收內存

字符編碼

字符編碼的介紹

計算機存放的都是二級制數字,我們輸入一個字符,計算機是不認識的,那麽就需要一個編碼表,吧我們寫入的字符轉換為二級制數,然後將輸入字符對應的二進制數寫入內存,再由內存寫入硬盤

在這之間只有一種編碼表

ASCII:只能表示英文字符,用1Bytes對應一個英文字符

內存:ASCII

硬盤:ASCII

GBK:可以表示中文字符和英文字符,用1Bytes表示一個英文字符,用2Bytes表示一個中文字符

內存:GBK
硬盤:GBK

Shift-JIS:
內存:Shift-JIS
硬盤:Shift-JIS

Euc-kr:
內存:Euc-kr
硬盤:Euc-kr

以上是各個國家的字符編碼,但是這種字符編碼只能在自己的國家使用,所以之後出現了一種統一的字符編碼

unicode:可以對應萬國字符,統一用2個Bytes表示一個字符

兩大特點:

  

1:可以兼容萬國字符
2 與萬國字符都有一種數字與數字的對應關系

人們寫入的字符先轉碼為unicode編碼寫進內存,再有硬盤裏的GBK、EUC-kr或Shift-JIS編碼表進行編碼之後寫進硬盤

如果要使用,就將字符經過解碼,轉變為unicode編碼,寫進內存後再通過unicode編碼表一一對應。

GBK數字-----解碼decode----->unicode數字
Shift-JIS數字-----解碼decode----->unicode數字

GBK數字<-----編碼encode-----unicode數字
UTF-8數字<-----編碼encode-----unicode數字

不同的字符編碼轉換為英文和中文對應的字節數如下

字符編碼    英文    中文

ASCII    1Bytes    無

GBK     1Bytes    2Bytes

Unicode 2Bytes   2Bytes

 Utf-8  1Bytes   3Bytes

保證不亂碼的關鍵

當初用什麽字符編碼存的,取的時候就用什麽編碼解碼

強調:此時計算機只能使用unicode與字符的對應關系

在pytohn2中

1 (執行python程序的第二個階段)解釋器在將py文件當普通的文本文件讀入內存時默認使用的編碼是ASCII
2 有兩種字符串類型:
  str:x="上" # 文件頭指定的編碼格式的二進制
  unicode:x=u"上" # 存成unicode格式的二進制

ps:pyhon2中unicode就是python3的str類型

在python3中:

1 (執行python程序的第二個階段)解釋器在將test.py當普通的文本文件讀入內存時默認使用的編碼是UTF-8
2 (執行python程序的第三個階段,開始識別語法),會字符類型的值開辟一個內存空間存入unicode格式的二進制
ps:python3中的str類型是unicode編碼的二進制

3 字符串類型
  str: x="上" 把‘上’ 存成unicode格式的二進制
  字節串=x.encode(‘utf-8‘)

文件頭:
在文件首行寫上:coding:utf-8
就是在告訴python解釋器,不要用其默認的編碼,用文件頭指定的編碼

文件處理

1 什麽是文件:

文件就是操作系統為用戶/操作系統提供的操作硬盤的抽象單位

2 為什麽要用文件

實現將內存中的數據永久保存到硬盤中

3 如何用文件

文件操作的基本步驟

f=open(r‘a.txt‘,encoding=‘utf-8‘) #打開文件,拿到一個文件對象f,f就相當於一個遙控器,可以向操作系統發送指令
f.read() # 讀寫文件,向操作系統發送讀寫文件指令
f.close() # 關閉文件,回收操作系統的資源

強調:一定要在程序結束前關閉打開的文件

上下文管理:

with open(文件路徑,mode=打開模式,encoding=編碼表) as f:   
  pass

with結束後會自動關閉文件

4 文件的打開模式

r:只讀模式

w:只寫模式

a:只追加模式

5 控制讀寫文件單位的方式(必須與r/w/a連用)

t:文本模式(默認的),一定要指定encoding參數

優點;操作系統會將硬盤中的二進制數字解碼城unicode然後返回

強調::只針對文本文件才會有效

whit open(a.txt,mode=rt,encoding = utf-8 ) as f:
    data = f.read()
    print(data,type(data))

with open(f.png,mode=‘‘rt,encoding = utf-8)as f:
    data = f.read()

二進制模式,一定不能制定encoding參數

with open(q.png,rb)as f:
    data = f.read()
    print(data,type(data))


with open(a.txt,mode = rb) as f:
    data = f.read()
    print(data,type(data))
    print(data.decode(utf-8))

r: 只讀模式L(默認的)

1當文件不存在是,會報錯

2 當文件存在時,文件指針指向文件的開頭

with open(a.txt,mode=rt,encoding=utf-8) as f:
    res1=f.read()
    print(111===>,res1)
    res2=f.read()
    print(222===>,res2)

with open(a.txt,mode=rt,encoding=utf-8) as f:
    print(f.read())
    print(f.readable())
    print(f.writable())
    print(f.readline())
    print(f.readline())

with open(a.txt,mode=rt,encoding=utf-8) as f:
    for line in f:
        print(line)

with open(a.txt,mode=rt,encoding=utf-8) as f:
    l=[]
    for line in f:
        l.append(line)
        print(l)
        print(f.readlines()        

w: 只寫模式

1 當文件不存在時,新建一個空文檔

2 當文件存在時,清空文件內容,文件指針跑到文件的開頭

with open(c.txt,mode=wt,encoding=utf-8) as f:
    print(f.readable())
    print(f.writable())
    print(f.read())

    f.write(哈哈哈\n)
    f.write(你愁啥\n)
    f.write(瞅你咋地\n)

    f.write(1111\n2222\n333\n4444\n)

    info=[egon:123\n,alex:456\n,lxx:lxx123\n]
    for line in info:
        f.write(line)
        f.writelines(info)

with open(c.txt,mode=rb) as f:
    print(f.read())


with open(c.txt,mode=wb) as f:
    f.write(哈哈哈\n.encode(utf-8))
    f.write(你愁啥\n.encode(utf-8))
    f.write(瞅你咋地\n.encode(utf-8))

a: 只追加寫模式

1 當文件不存時,新建一個空文檔,文件指針跑到文件的末尾
2 當文件存在時,文件指針跑到文件的末尾

with open(c.txt,mode=at,encoding=utf-8) as f:
    print(f.readable())
    print(f.writable())
    f.write(虎老師:123\n)

在文件打開不關閉的情況下,連續的寫入,下一次寫入一定是基於上一次寫入指針的位置而繼續的

with open(‘d.txt‘,mode=‘wt‘,encoding=‘utf-8‘) as f:
    f.write(‘虎老師1:123\n‘)
    f.write(‘虎老師2:123\n‘)
    f.write(‘虎老師3:123\n‘)

with open(‘d.txt‘,mode=‘wt‘,encoding=‘utf-8‘) as f:
    f.write(‘虎老師4:123\n‘)

with open(‘d.txt‘,mode=‘at‘,encoding=‘utf-8‘) as f:
    f.write(‘虎老師1:123\n‘)
    f.write(‘虎老師2:123\n‘)
    f.write(‘虎老師3:123\n‘)

with open(‘d.txt‘,mode=‘at‘,encoding=‘utf-8‘) as f:
    f.write(‘虎老師4:123\n‘)

06 Python字符編碼與文件處理