一.字符編碼
unicode:簡單粗暴,所有字符都是2Bytes,優點是字符->數字的轉換速度快,缺點是占用空間大
utf-8:精准,對不同的字符用不同的長度表示,優點是節省空間,缺點是:字符->數字的轉換速度慢,因為每次都需要計算出字符需要多長的Bytes才能夠准確表示

在最新的Python 3版本中,字符串是以Unicode編碼的,也就是說,Python的字符串支持多語言,例如:
>>> print('包含中文的str')
包含中文的str
對於單個字符的編碼,Python提供了ord()
函數獲取字符的整數表示,chr()
函數把編碼轉換為對應的字符:
>>> ord('A')
65>>> ord('中')
20013>>> chr(66)
'B'>>> chr(25991)
'文'
如果知道字符的整數編碼,還可以用十六進制這么寫str
:
>>> '\u4e2d\u6587''中文'
兩種寫法完全是等價的。
由於Python的字符串類型是str
,在內存中以Unicode表示,一個字符對應若干個字節。如果要在網絡上傳輸,或者保存到磁盤上,就需要把str
變為以字節為單位的bytes
。
Python對bytes
類型的數據用帶b
前綴的單引號或雙引號表示:
x = b'ABC'
要注意區分'ABC'
和b'ABC'
,前者是str
,后者雖然內容顯示得和前者一樣,但bytes
的每個字符都只占用一個字節。
以Unicode表示的str
通過encode()
方法可以編碼為指定的bytes
,例如:
>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
純英文的str
可以用ASCII
編碼為bytes
,內容是一樣的,含有中文的str
可以用UTF-8
編碼為bytes
。含有中文的str
無法用ASCII
編碼,因為中文編碼的范圍超過了ASCII
編碼的范圍,Python會報錯。
在bytes
中,無法顯示為ASCII字符的字節,用\x##
顯示。
反過來,如果我們從網絡或磁盤上讀取了字節流,那么讀到的數據就是bytes
。要把bytes
變為str
,就需要用decode()
方法:
>>> b'ABC'.decode('ascii')
'ABC'>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'
要計算str
包含多少個字符,可以用len()
函數:
>>> len('ABC')
3>>> len('中文')
2
len()
函數計算的是str
的字符數,如果換成bytes
,len()
函數就計算字節數:
>>> len(b'ABC')
3>>> len(b'\xe4\xb8\xad\xe6\x96\x87')
6>>> len('中文'.encode('utf-8'))
6
可見,1個中文字符經過UTF-8編碼后通常會占用3個字節,而1個英文字符只占用1個字節。
在操作字符串時,我們經常遇到str
和bytes
的互相轉換。為了避免亂碼問題,應當始終堅持使用UTF-8編碼對str
和bytes
進行轉換。
由於Python源代碼也是一個文本文件,所以,當你的源代碼中包含中文的時候,在保存源代碼時,就需要務必指定保存為UTF-8編碼。當Python解釋器讀取源代碼時,為了讓它按UTF-8編碼讀取,我們通常在文件開頭寫上這兩行:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
總結
一
1.以什么編碼存的就要以什么編碼取出
ps:內存固定使用unicode編碼
我們可以控制的編碼是往硬盤存放或者基於網絡傳輸選擇編碼
2.數據是最先產生於內存中,是unicode格式,要想傳輸需要轉成bytes格式
#unicode ---------->encode(utf-8)---------->bytes
拿到bytes--------->decode(gbk)---------->unicode
3.python3中字符串被識別成unicode
python中的字符串encode得到bytes
二.
open:
1.會向操作系統發起系統調用,操作會打開一個文件
2.在python程序中會產生一個值指向操作系統打開那個文件,我們可以把該值賦給一個x。
回收資源
1.f.close(): 關閉操作系統打開的文件,即回收操作系統的資源
2.del f: 沒必要做,因為在python程序運行完畢后,會自動清理與該程序有關的所有內存占用
f = open(r'aaaaa.py','r',encoding='utf-8') #print(f.read()) #print(f.readline(),end=") print(f.readlines()) f.close()
二Python對於文件處理的操作
- r ,只讀模式【默認模式,文件必須存在,不存在則拋出異常】
- w,只寫模式【不可讀;不存在則創建;存在則清空內容】
- x, 只寫模式【不可讀;不存在則創建,存在則報錯】
- a, 追加模式【可讀; 不存在則創建;存在則只追加內容】
- r+, 讀寫【可讀,可寫】
- w+,寫讀【可讀,可寫】
- x+ ,寫讀【可讀,可寫】
- a+, 寫讀【可讀,可寫】
- rb 或 r+b
- wb 或 w+b
- xb 或 w+b
- ab 或 a+b
read_f=open('a.txt','r',encoding='utf-8')
write_f=open('.a.txt.swp','w',encoding='utf-8')
with open('a.txt','r',encoding='utf-8') as read_f,\#將文件打開
open('.a.txt.swp','w',encoding='utf-8') as write_f:#並且再創建一個文件名為.a.txt.swp的文件
for line in read_f:
if 'alex' in line: #找到想要替換的內容
line=line.replace('alex','ALEXSB') #並且將舊的內容替換成新的內容存在.a.txt.swp的文件中
write_f.write(line) #不符合條件的不動
os.remove('a.txt') #將源文件刪除
os.rename('.a.txt.swp','a.txt') #將.a.txt.swp這個文件該成a.txt這樣就實現了文件內容的批量修改!
file 對象使用 open 函數來創建,下表列出了 file 對象常用的函數:
序號 | 方法及描述 |
---|---|
1 | 關閉文件。關閉后文件不能再進行讀寫操作。 |
2 | 刷新文件內部緩沖,直接把內部緩沖區的數據立刻寫入文件, 而不是被動的等待輸出緩沖區寫入。 |
3 | 返回一個整型的文件描述符(file descriptor FD 整型), 可以用在如os模塊的read方法等一些底層操作上。 |
4 | 如果文件連接到一個終端設備返回 True,否則返回 False。 |
5 | 返回文件下一行。 |
6 | 從文件讀取指定的字節數,如果未給定或為負則讀取所有。 |
7 | 讀取整行,包括 "\n" 字符。 |
8 | 讀取所有行並返回列表,若給定sizeint>0,返回總和大約為sizeint字節的行, 實際讀取值可能比 sizeint 較大, 因為需要填充緩沖區。 |
9 | 設置文件當前位置 |
10 | 返回文件當前位置。 |
11 | 從文件的首行首字符開始截斷,截斷文件為 size 個字符,無 size 表示從當前位置截斷;截斷之后 V 后面的所有字符被刪除,其中 Widnows 系統下的換行代表2個字符大小。 |
12 | 將字符串寫入文件,沒有返回值。 |
13 | 向文件寫入一個序列字符串列表,如果需要換行則要自己加入每行的換行符。 |
三:三元表達式
由三個元素組成的表達式形式。
例如:
x=2
y=3
if 2<3:
print(x)
else:
print(y)
可以直接轉換成三元表達式:
x if x<y else y