#文件处理,r,w,
# f = open('day14_2','r',encoding = 'utf-8')
# data = f.read(3) #代表读取3个字符
# data = f.read()
# print(data)
# f.close()
# f = open('day14_2.py','w',encoding = 'utf-8')
# f.write('11113ss\n')
# print(f.writable()) #判断文件是否可写
# f.writelines(['666\n','ss89ss1\n'])
# print(f.readable()) #判断文件是否可读
# f.close() #关闭文件
# f = open('day14_2.py','r',encoding = 'utf-8')
# print(f.readline()) #按行读取文件
# # f.close()
# print('按行读取后',f.readlines()) #按行把光标后的文件全部读取出来
# #r+: 可读,可写 ,文件必须存在,否则报错。读取时从头开始读取,写入时从头开始写,会覆盖已有文件
# f = open('day14_2.py','r+',encoding='utf-8')
# print(f.readlines()) #先读取全部,再写入时,会写到最后
# f.write('2asassss1111asas\n')
# print(f.readlines())
# #w+:可读,可写。文件不存在时创建文件,文件已存在时,会清空原文件,再写入。
# f = open('text.txt','w+',encoding='utf-8')
# f.write('第一行')
#a+:可读,可写。文件不存在时创建文件,文件存在时保留内容,读取时默认从末尾开始读取,写入文件始终追加到末尾
# f = open('day14_2.py','a+',encoding='utf-8')
# f.writelines('123456\n')
# print(f.readlines())
# f.seek(0)
# print(f.readlines())
# f.close()
#通过with …… as ……方式,可以打开文件,不需要f.close()
# with open('a.txt','r') as src_f,\
# open('b.txt','w') as dst_f:
#rb,wb,ab 通过字节编码读取和写入,不能指定编码,输出时需要指定解码方式
# f = open('text.txt','rb')
# print(f.readlines())
# f.close()
# f = open('text.txt','rb')
# print(f.read().decode('utf-8')) #读取时,需要解码
# b方式打开时,写入时需要为字节格式,输出时,需要解码
# f = open('day14_2','rb+')
# f.write(b'1234567891011\n')
# print(f.read().decode('utf-8'))
# # f.encoding 打印出当前文件的编码格式.注意,没有括号.rb模式打开时,encoding为None,无法获取编码方式。
# f = open('text.txt','r',encoding='utf-8')
# print(f.encoding)
# #f.tell()打印出当前光标的位置,按bytes编码来计算
# print(f.tell())
# #f.flush() 将缓冲区文件立即写入磁盘,需要进入python命令行运行观察效果,flush之前,文件不会被保存
# f = open('day14_2','w')
# f.write('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
# f.flush()
# f.seek() 定位光标的位置,以字节为单位,默认从开头开始算
# f = open('day14_2','rb')
# f.seek(4)
# print(f.tell())
# f.seek(4,1) #后面的1表示相对位置,即相对上一步操作后的光标位置
# print(f.tell())
# f.seek(-4,2) #后面的2表示倒序的位置,即从后往前数的位置
# print(f.tell())
# print(f.read())
# # f.truncate() 截取一段数据,从开头开始算,截取0-10字节的内容
# f = open('day14_2','rb+')
# f.seek(6)
# f.truncate(10)
# print(f.read().decode('utf-8'))
#读取日志中的最后一行
# with open('log.txt','rb') as log_f:
# n = -10
# while True:
# log_f.seek(n,2)
# data = log_f.readlines()
# if len(data) > 1:
# print('最新的日志是,%s' %(data[-1].decode('utf-8')))
# break
# n -= 10
#通过for循环整个文件句柄,避免将整个文件放到内存中,占用内存
with open('log.txt','rb') as log_f:
for i in log_f:
print(dir(log_f))
n = -10
while True:
log_f.seek(n,2)
data = log_f.readlines()
if len(data) > 1:
print('最新的日志是,%s' %(data[-1].decode('utf-8')))
break
n -= 10
#迭代器:对象有next方法,字符串、列表、元组、字典等
#可迭代对象:支持迭代器协议的对象,一般通过内置函数__iter__来实现
# l = [1,2,3]
# iter_l = l.__iter__()
# while True:
# try:
# print(iter_l.__next__())
# except StopIteration:
# print('its over')
# break
#内置next函数
# l1 = [i for i in range(10)]
# print(l1)
# iter_l1 = l1.__iter__()
# print(next(iter_l1))
# print(next(iter_l1))
# print(next(iter_l1))
#三元运算:通过单行代码实现for+ if 或者if + else
# name = 'alex'
# a = 'SB' if name == 'alex' else 'handsome'
# print(a)
# res = ['鸡蛋%s' %i for i in range(10) if i > 3]
# print(res)
#列表解析:使用三元运算快速创建列表的方式
# squar = [i**2 for i in range(10)]
# print(squar)
#生成器:将列表解析的中括号改为小括号后,就是生成器表达式,支持迭代器协议,生成器生成的就是可迭代对象,支持next方法
# squar = (i**2 for i in range(10))
# print(squar)
# print(squar.__next__())
# print(squar.__next__())
# print(squar.__next__())
# print(next(squar))
#yield 人口普查的例子
def get_population():
with open('人口普查.txt','r',encoding='utf-8') as f:
for i in f:
yield i
test = get_population()
# print(test.__next__())
a = sum(eval(i)['popu'] for i in test)
print(a)
test1 = get_population()
for i in test1:
name = eval(i)['name']
print('%s的人口占比: %.10f %%' %(name,eval(i)['popu']/a*100))
#生产者消费者模型
def consumer(name):
print('我是%s,我要开始吃包子了' %name)
while True:
baozi = yield
print('%s 开心的吃掉了%s。' %(name,baozi))
def producer():
c1 = consumer('张三')
# c2 = consumer('李四')
print(c1.__next__()) #相当于开始运行函数,这步运行后,yield返回None
# c2.__next__()
for i in range(100):
print(c1.send('第%s个包子' %i)) #后续循环时,函数返回值都是None
# c2.send('第%s个包子' %i)
producer()