常用操作2
1、f.flush()将文件内容从内存写入到磁盘
f.encoding 查看使用open打开文件的编码
f.tell() 查看当前打开文件的指针位置
f.seek(3) 将文件指针移到到第三个字节(seek默认是从0开始);
f.seek(3,1)表示将指针从当前位置向后移动3个字节
f.seek(-5,2)表示将指针从最后倒序向前移动5个字节位置(倒序用负数)
f.truncate(10) 保留截取的前10个字节 (不要用W或W+的方式读取——会清空数据)
2、迭代器协议:对象必须提供一个next方法(next可以进一步迭代或终止迭代)
可迭代对象:实现了迭代器协议的对象(对象内部定义一个__iter__()方法)
常用迭代器访问可迭代对象的工具:for循环,sum,min,max等
3、for循环实际上是先用 __iter__() 方法将对象转换为可迭代对象,同时执行了 __next__() 方法拿到每一个元素;
数据取完后还依据 stopiteration 来结束循环
4、生成器,自带转换为迭代器功能的一种数据类型,所有生成器就是可迭代对象
两种形式:函数形式(使用yield语句而不是return来返回结果,可以并列有多个yield,但每次调用只返回一个结果,
,返回一个结果后函数处于等待状态,直到下一次被调用才会返回第二个结果)
三元表达式(True if a > 10 else False)
5、用三元表达式做列表解析 a = [i for i in range(10)] , print(a) 得到一个列表
用三元表达式做生成器 a = (i for i in range(10)) , print(a.__next__()) 得到一个元素,print(next(a)) 得到第二个元素
列表解析用的是[],一次生成所有结果,比较占内存;
而生成器用的是(),一次只生成一个结果。
6、字典格式大文件读取
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def get_info(file="a.txt"): with open(file, "r") as f: for i in f: # 转换为可迭代对象 yield i # 生成器方式获取数据 info = get_info() # next(info)获取单条信息,用eval将字符串转换回字典,用key取对应的值, num1 = eval(info.__next__())["key"] num2 = eval(next(info))["key"] print(num1, num2) # 批量提取求和,for循环完成了next的工作 va = 0 for i in info: num = eval(i)["key"] va += num # 三元表达式方式 all = sum(eval(i)["key"] for i in info)
注意:迭代器只能迭代一次