Python學習筆記七

字節串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'

編碼註釋:
在源文件的第一行或第二行寫入如下內容爲編碼註釋:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章