Python读写的文件,分为文本文件和二进制文件。其中,读入文本文件,通常以“字符”的形式操作。读入的二进制文件,通常以“字节”形式进行操作。“字节”就是8位二进制的表示形式,“字节”与“字符”是不同的概念,其操作方式,也有很大的不同。
- 字节类型的定义
Python定义字节类型有两种方式:bytes和bytearray。
执行代码:
>>>a=b’Python’
>>>b=b’\x50\x79\x74\x68\x6f\x6e’
>>>c=bytearray([80,121,116,104,111,110])
>>>type(a) #显示 <class 'bytes'>
>>>type(b) #显示 <class 'bytes'>
>>>type(c) #显示 <class 'bytearray'>
>>>print(a) #显示 b'Python’
>>>print(b) #显示 b'Python’
>>>print(c) #显示 bytearray(b'Python')
- 字节类型的索引
像字符串那样,“字节序列”也是可以索引的,但索引的结果都是10进制表示的。
>>>print(a[3]) #显示 104
>>>print(b[3]) #显示 104
>>>print(c[3]) #显示 104
同样,“字节序列”也可以切片处理
>>>print(a[1:4]) #显示 b'yth'
>>>print(b[1:4]) #显示 b'yth'
>>>print(c[1:4]) #显示 bytearray(b'yth')
三、字节类型的操作
bytearray和list类型可以互相转换,转换的核心是每一个字节的十六进制数的数值
>>>type(list(c)) #显示 <class ‘list’>
>>>type(bytearry([1,2,3,4,5,6])) #显示 <class 'bytearray'>
像字符串一样,字节可以支持增强赋值操作符+=。
>>>ls=b’a’
>>>ls+=b’bcd’
>>>print(ls) #b’abcd’
四、函数接口
查找函数主要有find()
、rfind()
和index()
、rindex()
,r
开头表示从后往前查找。
- 替换:replace()
- 判断前缀后缀:startswith()、endswith()
- 分割:split()
- 从头尾移除特定字符:strip,默认移除空白,如传入b'abc'可以删除前后所有abc的任意组合;
- 是否只有数字:isalnum(),可以为空
- 是否是数字:isdigit(),不能为空
- 是否只有字母:isalpha()
- 是否只有ascii字符:isascii(),每个字节取值都在[0, 0x7F]
- 大小写判断:islower()、isupper(),不能为空
- 大小写化:lower()、upper()
- 标题判断和标题化:istitle()、title(),判断或转成Hello World的形式。
举一个例子:python以二进制读入一个文件,以字节为单位,将每个字节与0xe3做异或运算,最后将结果以二进制形式输出到文件。
fname='file_in.bin'
fi=open(fname,'rb')
s=fi.read()
ls=[]
c=0xe3
for i in range(len(s)):
ls.append(s[i]^c)
fo=open(file_out.bin','wb')
fo.write(bytearray(ls))
fi.close()
fo.close()