Python学习笔记七

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Katherine_hsr/article/details/83856018

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

编码注释:
在源文件的第一行或第二行写入如下内容为编码注释:


猜你喜欢

转载自blog.csdn.net/Katherine_hsr/article/details/83856018