文章目录
字节串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'
编码注释:
在源文件的第一行或第二行写入如下内容为编码注释: