文件处理模式:
打开文件的两种方式:
#第一种 f=open("1.txt","r+",encoding="utf-8") f.write("sfxdz\n") f.close() #第二种 with open("1.txt","r+",encoding="utf-8") as f: f.write("你好")
r模式:只读 (变量名+ read读取、readable判断是否可读、readline读取一行、readlines指定读取几个字符)
w模式:只写(实质:(文件若不存在新建空白文档)编辑新内容后进行覆盖) (write写、writeable判断是否可写、writelines以列表的形式写入)
a模式:只追加 (在文件的末尾处追加新内容) (write写、writeable判断是否可写、writelines以列表的形式写入)
还有r+ w+ a+模式
b模式:以字节的方式对字符串进行处理,b模式打开文件不用指定编码
1.字节转变成字符串的过程为解码(decode)
#用b的方式读取文件,是以字节的方式显示,如要查看文件内容,要通过解码的过程 f=open("1.txt","rb") data=f.read() print(data.decode("utf-8"))
2.字符串转变成字节的过程为编码(encode)
#用b的方式对文件进行写的操作,一定要把字符串先通过编码转换成字节再进行写入操作(通过bytes或者encode) f=open("1.txt","wb") f.write(bytes("你好\n",encoding="utf-8")) f.write("你好\n".encode("utf-8"))
#追加模式与写模式的操作相似 f=open("1.txt","ab") f.write(bytes("你好dfdss\n",encoding="utf-8")) f.write("你好dfds\n".encode("utf-8"))
其他文件操作:
encoding:查看文件打开的编码方式
f=open("1.txt","r") print(f.encoding)
flush:刷新并保存到硬盘
tell:显示光标当前所在位置(以字节为单位)
seek(数字,参数):控制光标移动的位置(以字节为单位)
默认参数为0,从文件开头开始seek,参数1、2都只要用b模式,参数为1,则从光标当前位置开始seek,参数为2,数字为负数,则从文件末尾倒序开始seek(可用于日志查询)
f=open("日志","rb") for i in f: #用f而不用f.readlines能减少内存的占用,用一行取一行 offs=-10 while True: f.seek(offs,2) date=f.readlines() if len(date) > 1: print(date[-1].decode("utf-8")) break offs =offs*2
truncate(数字):实质是写的操作,从文件开头开始截断,只显示0-数字的字节(不能用w、w+模式,以字节为单位)
read:以字符为单位
迭代器:
迭代器协议:是指对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么引起一个Stoplteration异常,以中止迭代(只能前进不能后退)
可迭代对象:实现迭代器协议的对象(对象内部定义--iter--()方法)
可迭代对象实现了迭代器协议,python内部工具(如for循环、sum、min、max函数)使用迭代器协议访问对象
for循环的本质:使用迭代器协议循环所有对象(1.先用--iter--()变成可迭代对象 2.再调用---next--()方法进行循环 3.遇到异常,中止迭代)
s="hello" st=s.__iter__() print(st.__next__()) #可迭代对象的方法 print(st.__next__()) print(st.__next__()) print(next(st)) #python内置的方法 print(next(st))
所以for循环提供了迭代所有对象的统一方法。
循环方式:1.使用索引进行循环(仅限于序列类型:字符串、列表、元组)
2.for循环(一切对象,包括序列类型、非序列类型、文件内容)
生成器:
三元表达式:
name="alex" #name="dasjhd" l=("sb" if name == "alex" else" 帅哥") #这就是三元表达式,最多只有三元 print(l)
列表解析:
l=["鸡蛋%s" %i for i in range(10)] print(l)
生成器:是一种数据类型,自动实现迭代器协议,所以生成器就是可迭代对象
生成器在python中的表现形式:
1.生成器函数:常规函数定义,使用yield语句而不是return语句,yield一次返回一个结果,但可多次执行yield,在每个结果中间,挂起函数的状态,以便于下次从它离开的地方继续执行
def text(): yield 1 yield 3 g=text() print(g) print(g.__next__())
2.生成器表达式:类似于列表推导,但生成器返回的是一个对象,而不是一个构建一个结果列表
l=("鸡蛋%s" %i for i in range(10)) print(l) print(l.__next__()) print(next(l))
使用生成器的优点:能进行延迟操作,是指在需要的时刻才产生结果,而不是立刻产生结果,能节省内存。
总结:1.把列表解析的[]换成()就是生成器表达式
2.列表解析和生成器表达式都是一种便利的编程方式,不过生成器表达式更省空间
3.python不但使用迭代器协议,让for循环更加通用,大部分内置函数,也是使用了迭代器协议访问对象的,例如sum函数,该函数用迭代器协议访问对象,
而生成器实现了迭代器协议。
原文:https://www.cnblogs.com/sakura-gyt/p/12773392.html