文章目錄
字節串bytes和字節數組bytearray
字節串bytes
作用:存儲以字節爲單位的數據
說明:字節串是不可變的字節序列,字節是0-255之間的整數
創建空字節串的字面值:
b’’
b""
b’’’’’’
b""""""
B’’
B""
B’’’’’’
B""""""
創建非空字節串的字面值:
b’ABCD’
b’\x41\x41’
b’hello world’
字節串的構造函數 bytes
bytes() # 生成一個空的字節串,等同於b’’
bytes([10, 20, 30, 40, 50, 60]) # b'\n\x14\x1e(2<'
bytes(整型可迭代對象) # 用可迭代對象初始化一個字節串
bytes(range(97, 97+26)) # b'abcdefghijklmnopqrstuvwxyz'
bytes(整數n) # 生成n和值爲零的字節串
bytes(10) # b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
bytes(字符串, encoding=‘utf-8’) # 用字符串的轉換編碼生成一個字節串
bytes('hello', 'ascii') # b'hello'
bytes('hello小小貓', encoding='utf-8') # b'hello\xe5\xb0\x8f\xe5\xb0\x8f\xe7\x8c\xab'
字節串的運算
+ += * *=
< <= > >= == !=
in/not in
索引/切片
示例:
b = b'abc' + b'123' # b'abc123'
b'ABC' * 4 # b'ABCABCABCABC'
b'ABC' < b'ABD' # True
b = b'ABCD'
65 in b # True
b'A' in b # True
# 索引
b = b'ABCD'
b[0] # 65
b[1] # 66
b[-1] # 68
# 切片
b = b'ABCDEFG'
b[::2] # b'ACEG'
用於序列函數:
len(x), max(x), min(x), sum(x), all(x), any(x)
b = b'ABCDEFG'
len(b) # 7
max(b) # 71
min(b) # 65
sum(b) # 476
bytes 與 str的區別:
bytes 存儲字節(0-255)
str 存儲Unicode字符(0-65535)
bytes 與 str 的轉換:
編碼(encode)
str ---------> bytes
b = s.encode(‘utf-8’)
s = 'abc中文'
b = s.encode('utf-8') # b'abc\xe4\xb8\xad\xe6\x96\x87'
解碼(decode)
bytes ------------> str
s = b.decode(‘utf-8’)
s = 'abc中文'
b = s.encode('utf-8') # b'abc\xe4\xb8\xad\xe6\x96\x87'
s2 = b.decode('utf-8') #'abc中文'
字節數組bytearray
字節數組是可變的字節序列
創建字節數組的構造函數:
bytearray() # 創建空的字節數組
bytearray(整數)
bytearray(整型可迭代對象)
bytearray(字符串, encoding=‘utf-8’)
注:以上參數等同於字節串
字節數組的運算:
+ += * *=
比較運算: < <= > >= == !=
in/not in
索引/切片(字節數組支持索引和切片賦值,規則與列表相同)
bytearray的方法:
B.clear() # 清空字節數組
B.append(n) # 追加一個字節(n爲0-255的整數)
B.remove(value) # 刪除第一個出現的字節,如果沒有出現,則產生ValueError錯誤
B.reverse() # 字節的順序進行反轉
B.decode(encoding='utf-8') # 解碼
B.find(sub[, start[, end]]) # 查找
文件
文件是數據存儲的單位;文件通常用於長期存儲數據;文件中的數據是以字節爲單位進行順序存儲的。
文件的操作流程:
(1) 打開文件
(2) 讀寫文件
(3) 關閉文件
任何的操作系統,一個應用程序同時打開文件的數量有最大數量限制。
文件打開函數 open
open(file, mode=‘rt’) 用於打開一個文件,返回此文件對應的文件流對象,如果打開失敗,則會觸發OSError錯誤
文件關閉方法:
F.close() 關閉,釋放系統資源
示例:
# 此示例示意文件的打開和關閉,及錯誤處理
#f = open('/Users/shiruihuo/Desktop/study/GRE_CE_2016_Complete.pdf') # 此時能成功打開文件
try:
f = open('/Users/abc.txt') # 此文件不存在,會出現FileNotFoundError錯誤
print("文件打開成功")
# 在此處進行文件的讀寫操作
f.close() # 關閉文件
except OSError:
print("文件打開失敗")
python文件讀寫的類型有兩種:文本文件(text file)和二進制文件(binary file)
文本文件的操作
默認文件中存儲的都爲字符數據,以行爲單位進行分隔,在python內部統一用’\n’作爲換行進行分隔。
對文本文件進行讀寫需要用字符串(str)進行數據讀取和寫入
各種操作系統的換行符:
Linux換行符:’\n’
Windows換行符:’\r\n’
舊的Macintosh的換行符:’\r’
新的Mac Os換行符:’\n’
文件中的常用方法:
# 文件中常用的方法
F.close() # 關閉文件
F.readline() # 讀取一行數據,如果到達文件末尾則返回
F.readlines(max_chars=-1) # 返回每行字符串的列表,max_chars爲最大字符(或字節)數
F.writelines(lines) # 每行字符串的列表
F.flush() # 把寫入文件對象的緩存內容寫入到磁盤
F.read(size=-1) # 從一個文件流中最多讀取size個字符
F.write(text) # 寫一個字符串到文件流中,返回寫入的字符數
# 二進制文件操作方法
F.tell() # 返回當前文件流的絕對位置
F.seek(offset, whence=0) # 改變數據流的位置,返回新的絕對位置
F.readable() # 判斷這個文件是否可讀,可讀返回True,否則返回False
F.writable() # 判斷這個文件是否可寫,可寫返回True,否則返回False
F.seekable() # 返回這個文件對象是否支持隨機定位
F.truncate(pos=None) # 剪掉自pos位置之後的數據,返回新的文件長度(字節爲單位)
# 此示例示意文件的打開和關閉,及錯誤處理
def read_text_data():
try:
f = open("/Users/shiruihuo/Desktop/study/practice/info.txt")
# 讀取數據並打印在屏幕上
while True:
s = f.readline()
if not s: # 已讀取到最後一行,退出讀取
break
else:
if s[-1] == '\n':
print(s[:-1])
else:
print(s)
# 關閉文件
f.close()
except OSError:
print("打開info.txt文件失敗")
if __name__ == '__main__':
read_text_data()
f.readlines示例:
# 此示例示意f.readlines用法
try:
f = open("/Users/shiruihuo/Desktop/study/practice/info.txt")
l = f.readlines() # 返回所有行的列表
print(l)
f.close()
except OSError:
print("文件打開失敗")
文檔文件的寫操作
'r' # 以只讀的方式打開
'w' # 以只寫方式打開,刪除原有文件內容(如果文件不存在,則創建該文件並以只寫方式打開)
'x' # 創建一個新文件,並以寫模式打開這個文件,如果文件存在則會產生FileExistsError錯誤
'a' # 以只寫文件打開一個文件,如果有原文件則追加到文件末尾
'b' # 用二進制模式打開
't' # 文本文件模式打開
'+' # 爲更新內容打開一個磁盤文件(可讀可寫)
# 缺省模式是'rt'
# 'w+b' 可以實現二進制隨機讀寫,當打開文件時,文件內容將被清零
# 'r+b' 以二進制讀和更新模式打開文件,打開文件時不會清空文件內容
# 'r' 以文本模式讀和更新模式打開文件,打開文件時不會清空文件內容
# 以‘w’方式寫文件
f = open('/Users/huoshirui/Desktop/test/code/practice/mynote.txt', 'w')
f.write('hello')
f.close()
# 以‘a’方式寫文件
f = open('/Users/huoshirui/Desktop/test/code/practice/mynote.txt', 'a')
f.write('world')
f.close()
# f.writelines()方法的用法寫入文件
f = open('/Users/huoshirui/Desktop/test/code/practice/mynote.txt', 'w')
L = ['我是第一行\n', '我是第二行']
f.writelines(L)
f.close()
文本文件的迭代讀取
open()函數返回來的文件流對象是可迭代對象
示例:
f = open('abc.txt')
# 每次取出一行,相當於line=f.readline()
for line in f:
pirnt(line)
f.close()
標準輸入輸出文件
模塊名:sys
sys.stdin # 默認爲標準鍵盤輸入設備,標準輸入文件對象
ctrl+d 輸入文件末尾標識符
sys.stdout # 默認爲屏幕終端,
sys.stderr # 默認爲屏幕終端,標磚錯誤輸出對象,用於輸出錯誤信息
標準文件不需要打開和關閉就可以使用
示例:
import sys
s = sys.stdin.readline()
print("從鍵盤讀取的第一行是:", s)
s = sys.stdin.read()
print("read讀取的信息是:", s)
print("程序退出")
import sys
sys.stdout.write('hello world\n')
sys.stderr.write("error\n")
flush 方法
下面示例flush的用法
import time
f = open('/Users/huoshirui/Desktop/test/code/practice/mynote.txt', 'w')
f.write('hellooooooooo')
f.flush()
time.sleep(15)
print("程序睡醒了,繼續執行")
f.close()
二進制文件操作
‘b’ 二進制(binary)文件操作
對於二進制文件的讀寫通常需要用字節串(bytes)進行操作
# 此示例示意以二進制方式讀取文件內容,然後再將其轉換爲字符串
try:
f = open('/Users/huoshirui/Desktop/test/code/practice/mynote.txt', 'rb') # 以二進制模式打開
# 在此處對f綁定的對象以bytes爲單位進行讀寫
b = f.read(5) # 5代表5個字節(bytes)
print(b)
b = f.read() # 讀取全部字節,直至文件尾
print(b)
print('讀取的內容轉爲文字後爲:', b.decode('utf-8'))
f.close()
except OSError:
print("打開文件失敗")
# 此示例示意以二進制的模式進行寫操作
try:
f = open('/Users/huoshirui/Desktop/test/code/practice/mynote.txt', 'wb')
# 在此處需要以字節串爲單位進行寫操作
f.write(b'\xe4') # 中字編碼 e4 b8 ad
f.write(b'\xb8')
f.write(b'\xad')
f.close()
except OSError:
print("fail to open file")
# 此示例示意用f.tell()方法獲取文件當前的讀寫位置
try:
f = open('/Users/huoshirui/Desktop/test/code/practice/mynote.txt', 'rb')
print("當前的讀寫位置是:", f.tell()) # 0
b = f.read(5)
print("當前的讀寫位置是:", f.tell()) # 5
b = f.read() # 讀取全部內容
print("文件最後的位置是:", f.tell()) # 21
f.close()
except OSError:
print("fail to open file")
F.seek() 方法
F.seek(偏移量,whence=相對位置)
偏移量:大於0代表向文件末尾方向移動;小於0代表向文件開頭方向移動
相對位置:0代表從文件頭開始;1代表從當前讀寫位置開始偏移;2代表從文件尾開始偏移
示例:
# 此示例示意f.seek()方法
try:
f = open('/Users/huoshirui/Desktop/test/code/practice/mynote.txt', 'rb')
# 方法一
#f.seek(5, 0) # 相對於文件頭向後移動5個字節
# 方法二
#f.seek(-16, 2) # 相對於文件尾向前移動15個字節
# 方法三
f.read(2) # 先讀取兩個字節
f.seek(3, 1) # 從當前位置向後移動3個字節
b = f.read(5)
print(b) # b'abcde'
f.close()
except OSError:
print("fail to open file")
漢字編碼
GBK編碼佔20個字節,UTF-8佔30個字節
國際系列:GB18030(二字節或四字節編碼)
GBK(二字節編碼)
GB2312(二字節編碼)
(Windows常用)
國際標準:UNICODE <-------> UTF-8
(Linux/Mac OS X/IOS/Android常用)
Python 編碼字符串
‘gb2312’
‘gbk’
‘gb18030’
‘utf-8’
‘ascii’
s = '中文'
s.encode('utf-8') # b'\xe4\xb8\xad\xe6\x96\x87'
s.encode('gbk') # b'\xd6\xd0\xce\xc4'
編碼註釋:
在源文件的第一行或第二行寫入如下內容爲編碼註釋: