2018年12月22日 前盖前保间隙 函数复习

 

windows 中回车是 \r\n

unix/linux中是\n

f=open('test3','rb')
#以字节滴方式操作,rb,wb,xb,ab或者r+b,w+b,w+b,a+b;后面不用加encoding=
data=f.read()
print(data.decode('utf-8'))#用decode解码,把字节解码回字符串
f.close()

f=open('test2','wb')
data=f.write('多大多大'.encode('utf-8')) #用encode()编码,然后再输入到test2

 

f=open('test2','r+',encoding='utf-8',newline="")#newline用于区分换行符
print('1.closed检是否关闭:',f.closed)
print('2.encoding显示文件是何编码',f.encoding)
print('3.flush刷新,将内存上数据保存再内存上,就是自动保存::',f.flush())
f.readline()
print('4.tell查询光标位置',f.tell())#read(3)代表读取3个字符,其余文件内 光标移动都是以字节为单位如seek,tell,read,trucate,tell()查询
print('5.seek光标的移动,从头开始计算',f.seek(3))
# print('6.readlines打印光标以后剩余内容',f.readlines())
print('7.read(n)读取光标后的字符,括号内代表读取数量',f.read(5))
print('8.truncate()文件截断,从文件开头开始:',f.truncate(5))#文件中只截取5个字节

 

 

f=open('test4','rb')
print(f.tell())
print(f.seek(5,0))
#0默认为文件开头
print(f.seek(3,1))# 1代表相对于上一次光标的位置  用seek高端用法,上面必须写rb模式,而且没有encoding=
print(f.seek(-3,2))#2代表倒序,所以用-3
print(f.readlines())

 

#取最后一行
g=open('test3','rb')
data=g.readlines()#将文档变成list形式
print(data[-1].decode('utf-8')) # data[-1]代表取list最后一个值

#seek取最后一行
h=open('test3','rb')
for i in h:#此处取值也是一次一行,省内存如果用g.readlines()特别占用内存
    offs=-10
    while True:
        h.seek(offs,2)
        data=h.readlines()
        if len(data) > 1: #判断是否读完最后一行
            print('读取最后一行:%s'% (data[-1].decode('utf-8')))
            break
        offs*=2  #如果没有读完最后一行,则把offs增加

 

迭代器和生成器和for循环工作原理

 迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么导致stoplteration异常,终止迭代

可迭代对象:实现来迭代器协议的对象(对象内部定义一个__iter__方法)

print("_"*50)

l=[1,2,3,4]
x=l.__iter__() #先把l变成可迭代对象
print(x)#打印出转化后的字符串的可迭代对象
print(x.__next__())
print(x.__next__())#next方法
print(x.__next__())
print(x.__next__())

print('*'*44)

for i in l :
    print(i)
# 先执行xx=l.__iter__()方法
# 后执行到StopIteration 就停止for循环

print('&'*55)
index=0
while index<len(l):#不用迭代器只用索引的方法遍历List
    print(l[index])
    index+=1

print('^'*44)


dic={"a":1,"b":2,"c":3}
iter_d=dic.__iter__()
print(iter_d.__next__())# next 得到的就是key值

f=open('test3','r+')
iter_f=f.__iter__()
print(iter_f.__next__(),end='')
print(iter_f.__next__(),end='')
print(iter_f.__next__(),end='')
print(iter_f.__next__(),end='')

print("$"*44)
for i in f:
    print(i,end='')

 

f=[5,2,3,4,6]
data=f.__iter__()
print(next(data))#next 内置函数
print(next(data))
print(next(data))

next 就是在调用迭代器的__next__

next是python内置,__next__是数据类型内置的函数。

 

posted @ 2018-12-22 19:29  小圣庄  阅读(179)  评论(0编辑  收藏  举报