Python之路,第十六篇:Python入门与基础16

时间:2023-03-08 16:19:52
Python之路,第十六篇:Python入门与基础16

python3   bytes 和 bytearrary

bytes

二进制文件的读写:

什么是二进制文件读:

文件中以字节(byte)为单位存储,不以换行符(\n)为单位分隔内容的文件;

 f = open('mytext.txt', 'w')
f.write("你好中国")
f.close() $xxd mytest.txt
e4db a0e5 a5bd b8ad e59b bd0a

二进制文件操作方法:

F.read( size = -1 )     从一个文件流中最多读出size个字符

F.write(字符串/字节串)    写一些数据到文件流中,返回写入的字节数(字符数)

F.tell()   返回当前文件流的绝对位置

F.seek( cookie,   whence=0)  改变数据流的位置,返回新的绝对位置

F.readable()           判断这个文件是否可读,可读则返回True

F.writable()            判断这个文件是否可写,可写则返回True

 f = open('mytext.txt', 'rb')
b = f.read() # bytes 类型
f.close()
print(len(b)) #用len取值

F.read()   返回类型:

文本文件, 返回字符串

二进制文件,返回字节串(字节序列)

 f = open('mytext.txt', 'wb')
f.write("你好".encode("utf-8")) #6个字节
f.write(b"ABCD")
f.write(b"\n")
f.write(b"hello abcd\n")
f.close()
 f = open('mytell.bin', 'wb')
print("f.tell返回:", f.tell()) #
b = f.read(5)
print(b)
print("f.tell返回:", f.tell()) #
f.close()

F.write(x) 函数

F.seek(偏移量, whence=相对位置)

偏移量: 大于0 的数代表向文件尾放心移动

小于0 的代表向文件头方向

相对位置:

0    代表从文件头开始偏移;

1    代表从当前位置开始偏移;

2     代表从文件尾开始偏移;

 f = open('mytell.bin', 'wb')
print("f.tell返回:", f.tell()) #
b = f.read(5)
print(b)
print("f.tell返回:", f.tell()) # f.seek(10, 0) # 从开头向后10个字节
f.seek(5, 1) # 从当前位置向后移5个字节
f.seek(-10, 2) # 从文件尾向前移动10个字节
b = f.read(5) #读5个字节
print(b) #b'12345' f.close()

bytearray类型

bytes 类型不可变类型
bytearray 类型为可变的数据类型

操作
+ += * *=
比较运算:< 、<= > >= == !=
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的数;

创建字节串(bytearray)的函数
bytearray()创建空的字节串
bytearray (整数)
bytearray(整型可迭代对象)
bytearray(字符串,encoding='utf-8')
index /slice  索引/切片

 bytearray()
bytearray(b'')
bytearray(10)
bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
bytearray([65,66,67,8])
bytearray(b'ABC\x08')
bytearray([65,66,67,68])
bytearray(b'ABCD')
bytearray('ABCD你好','utf-8')
bytearray(b'ABCD\xe4\xbd\xa0\xe5\xa5\xbd')
bytearray(b'abcdef')
bytearray(b'abcdef')
ba1 = bytearray(b'ABCD')
ba2 = bytearray(b'EF')
ba1 + ba2
bytearray(b'ABCDEF')
ba1
bytearray(b'ABCD')
ba1[0]
65
ba1[0]=97
ba1
bytearray(b'aBCD')
ba3 = bytearray(b'ABCDEF')
ba3[::2]
bytearray(b'ACE')
ba3
bytearray(b'ABCDEF')
ba3.clear()
ba3
bytearray(b'')
ba3.append(97)
ba3
bytearray(b'a')
ba3.append(98)
ba3
bytearray(b'ab')
ba3.append(100)
ba3.append(97)
ba3
bytearray(b'abda')
ba3.remove(97)
ba3
bytearray(b'bda')
ba3.remove(97)
ba3
bytearray(b'bd')
ba3.remove(97)
Traceback (most recent call last):
File "<input>", line 1, in <module>
ValueError: value not found in bytearray
ba = bytearray(b'A1B2C3D4')
ba.reverse()
ba
bytearray(b'4D3C2B1A')
s = ba.decode('utf-8')
s
'4D3C2B1A'
type(s)
<class 'str'>
ba
bytearray(b'4D3C2B1A')
ba.find(bytearray(b'3C'))
2
ba.find(bytearray(b'3CC'))
-1

练习1

 #有一个bytearray字节序列,ba = bytearray(b'a1b2c3d4')
#如何得到1234和abcd
#将上述bytearray 修改为bytearray(b'A1B2C3D4')
ba = bytearray(b'a1b2c3d4')
print(ba[1::2]) #bytearray(b'1234')
print(ba[1::2].decode('utf-8')) #
print(ba[::2].decode('utf-8')) #abcd
#
ba[::2] = 'ABCD'
#ba[::2] = 'ABCD'
#TypeError: can assign only bytes, buffers, or iterables of ints in range(0, 256)
ba[::2] = b'ABCD' #bytearray(b'A1B2C3D4')
ba[::2] = bytearray(b'ABCD') #bytearray(b'A1B2C3D4')

标准输入输出文件:
sys.stdin
sys.stdout
sys.stderr

模块 sys
例子:

------mystdout.py-----------
sys.stdout.write("你好") #标准输出
sys.stdout.write("\n中国\n")

sys.stderr.write("我的出现是个错误\n")#标准错误输出

s = sys.stdin.read() #标准输入
print(s)
--------------
mystdout.py < input.txt
----------------input.txt------
这是标准输入的文本。
》》》
你好
中国
我的出现是个错误
这是标准输入的文本。
=========================================

ctr + D 输入文件结束符
输入重定向的文件内容将发送给sys.stdin

=================

汉字编码:

GB18030 ( GBK ( GB2312 ) )

UNICODE <-> UTF-8

注:BIG5(略过)

GB2312-80编码: 1980年发布,用两个字节进行编码,编码范围(A1A1~FEFE)包含汉字6763个和682个其他字符;

GBK编码:1995年制订,两个字节编码(8140~FEFE)(剔除xx7F)收录文字21003个;

第一个字节: 81-FE

第二个字节: 40-7E, 80-FE

GB18030-2005编码:收录了27533个汉字,用两字节或四字节进行编码;

ISO:

UNICODE -16 (两字节)

0x0000 -- 0xFFFF

ASCII ( 0-127 ) --> (  0x0000-0x007F )

UNICODE-32(四字节)

ASCII (0-127) --->  ( 0x00000000-0x0000007F )

UTF-8 ( 8-bit unicode Transformation Font/Format )

Unicode <<--->>UTF-8 互转

0x0000 ~ 0x007F   一字节

0x0080 ~ 0x07FF   二字节

0x0800 ~ 0xFFFF   三字节(中国落在此区域)

 f = open("gb2312.txt",'rb')
b = f.read()
s = b.decode('gbk') #'gbk'/'gb2312'/'gb18030'
print(s)
f.close()
#我是gbk测试中文#gb2312.txt