常用操作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、字典格式大文件读取 

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)
View Code

注意:迭代器只能迭代一次

posted @ 2020-05-17 22:20  虾米维生素  阅读(142)  评论(0编辑  收藏  举报