b模式——使用二进制方法读写文档的模式
f = open('test11.py','rb') #b的方式不能指定编码
data = f.read()
字符串和字节的转换机制
‘字符串’------encode------> bytes
bytes---------decode------> ‘字符串’
print(data.decode('utf-8'))
f.close
#####################################
f = open('test22.py','wb')
x = 'heloo'
x1 = bytes(x,encoding = 'utf-8') #对字符进行编码,转换为字节形式
f.write(x1)
f.close()
x.encoding('utf-8') #使用utf-8模式对字符串编码
在Python当中,文件默认的处理方式,统一为文本方式
文档操作的处理方法
- f.closed #判断文件是否关闭,输出相应的布尔值
- f.encoding #对文件编码,返回的是文件的编码形式
- f.flush() #保存一次文件
######需要注意的是,在utf-8编码下,一个字符算一个字节##########
- f.tell() #读取光标的所在位置
- f = open('b.txt','r',encoding = 'utf-8',newline = ' ') #读取文件中真正的换行符号
- f.seek(x) #控制光标的移动,按照x个字节进行移动(在默认情况下,从文档的开头向前移动)
###########read方法读的是字符。注意!!!!########
- f.truncate() #对文件进行截取(只有在写入模式下才能使用。只有w不行!)
相对于原起始位置的seek操作 :
- f.seek() #默认从光标位置向后移动x个字节
相对于原起始位置的seek操作 :
- f.seek(45,1) #后一个参数为相对位置(负的就是倒着读,从结尾开始算)
读取文件的最后一行 :
offs = 10
while True :
f.seek(offs,2)
data = f.readlines()
if len(data) > 1 :
print('文件的最后一行是%s' %(data[-1].decode))
break
offs *= 2
注意:只有在b模式下,光标才可以从结尾开始移动。若使用文本形式打开文件,那么只能从文档开头进行读取
迭代器协议
- 迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代(只能往后走不能往前退)
- 可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter()__方法)
- 协议是一种约定,可迭代对象实现了迭代器协议,Python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象
事实上,字符串、列表、元组、字典、集合、文件对象都不是可迭代对象,只不过在for循环式,调用了他们内部的__iter__方法,把他们变为可迭代对象
l = [1,2,3]
iter_l = l.__iter__() #遵循迭代器协议,生成可迭代对象
print(iter_l.__next__())
迭代器的好处:省内存
next(iter_l) #就是iter_l.next()
生成器
一种数据类型,这种数据类型自动实现了迭代器协议,是一种可迭代对象。
生成器分类以及在Python中的表现形式
- 生成器函数,用yield进行返回操作,而不是return
- 生成器表达式:类似于列表推导
三元表达式:
name = 'alex'
res = 'SB' if name == 'alex' else '帅哥'
print(res)
- 列表解析
egg_list = []
for i in range(10) :
egg_list.append('鸡蛋%s' %i)
print(egg_list)
- 生成器表达式
('鸡蛋%s' %i for i in range(10) if i > 5)
laomuji = ['鸡蛋%s' %i for i in range(10)]