文件处理,三元操作符,seek()函数,迭代函数和列表解析,reduce函数
1.文件读取方类型
r,r+,w,x,a,
r,读文件
w,写文件,文件内容全部删除,并将新内容从第一行开始赋值
x,写文件,只有文件不存在,可写,文件存在,报错
a,在文件莫问追加信息
r+,w+,x+,a+ 文件均为可读可写
rb,wb,xb,ab
rb,b的方式不能指定编码,读出原生二进制码,要显示原生字符需要解码操作
f = open('test11.py','rb') data = f.read() print(data) window平台,二进制可显示回车符‘\r\n’
2.文件处理b模式与seek()函数用法(三种模式)
seek(self,0)光标以0绝对位置移动到指定self位置,seek(self,1)必须b模式打开文件;以相对位置方式移动,如首次seek(10,1),seek(3,1) 光标第二次向后移动3个字节;seek(self,2)光标以首先移动到最后自己,再以self指定位置移动,2模式多用于读取文件,日志最后航=行
#数字与二进制转换的两种方法 res = bin(111).replace('ob','') print(res) "{0:b}".format(12345) #字符串转换成二进制,bytes()方法,encode方法 x = 'yyk' b = bytes(x,encoding='utf-8') #方法一 print(b) print(type(x),type(b)) print(x.encode('utf-8')) #方法二 f = open('test11.py','rb',encoding='utf-8') #b方式不能指定编码形式 上述代码报错 f = open('test.py','rb') data = f.read() print(data) print(data.decode('utf-8')) #默认换行 f.close() f = open('gbk1','wb')# b的方式不能编码 f.write(bytes('123\n',encoding='utf-8'))#写入文件的两种形式 f.write('yyk'.encode('utf-8')) f.close() f = open('test.py','ab')#b的方式不能编码 f.write(bytes('yyk',encoding='gbk')) #首先windows系统内部用gbk编码,其次文件用什么形式编码,对应用什么形式写入 f.write('yyk'.encode('gbk')) f.write(bytes('yyk',encoding='utf-8')) f.write('yyk'.encode('utf-8')) f = open('a.txt','r+',encoding='utf-8') data = f.read() print(data) f.write('\naaaaa?') f = open('a.txt','r',encoding='gbk',newline='') f = open('a.txt','r',encoding='utf-8',newline='') #newline方式,真正读取到os系统中的换行符\r\n res = f.readlines() print(f.tell()) #光标所在位置 f = open('a.txt','w',encoding='utf-8') a = f.read() #read()与readlines()区别,read()直接读出所有数据,readlines()将读到内容输入到列表中 print(a) a = f.readlines() print(a) #除了read()方法,python处理文件用字符方法,其余文件读取方法用字节方法 f.seek(0) print(f.readlines()) print(f.tell()) #seek(self,1)模式 f = open('seek.txt','rb') print(f.tell()) f.seek(10,1) print(f.tell()) f.seek(3,1) print(f.tell()) #seek(self,2)模式 print(f.read(2)) #read(),字符方法读取文件(光标移动为一个位置一个字符)结果-‘你好’其余方式读取文件内光标移动都是以字节为单位,如tell(),seek() f.seek(0) print(f.tell()) #tell(),字节方法读取文件(unicode2字节,gbk2字节,utf-8(2字节),结果-'['你好yuyukun\n', 'aaaaaaaa']') f.write('aaaa') f.truncate(2) #截取字节,数字代表字节数 x = 'yyk' y = 'aaa' print(bytes(x.encode('utf-8')),bytes(y.encode('utf-8'))) print(f.seek(5)) print(f.readlines()) print(f.tell()) f.seek(0) print(f.readlines()) print(f.tell()) print(f.seek(3,2)) for i in f: # f.seek(0) data = f.readline() print(data.decode('utf-8')) # seek(self,0)读取文件的方式 # 3种:seek(self,0)或1,2 f = open('a.txt','rb') for i in f: offs = -2 while True: f.seek(offs,2) data = f.readlines() if len(data) > 1: #防止文件读不全,如果参数为0,结果是bsbsb,不符合要求,所以参数应大于1,至少读到倒数第二行,并将这些行放到列表中,输出最后一行,即列表[-1] print('最后一行是%s'%(data[-1].decode('utf-8'))) break elif len(data) == 1: print(111) f.seek(0) print('文件只有一行时读到最后一行的数据是%s'%(f.readlines())) #只有一行时,遍历列表只遍历一个字符串!! break else: offs *=2 f.close()
4.迭代器:可以被next()函数调用并不断返回下一个值的对象称为迭代器(iterator)
卖包子,下蛋模型和迭代器人口统计模型
人口普查源数据:
{'name':'北京','population':100} {'name':'山东','population':200} {'name':'山西','population':300} {'name':'河北','population':400} {'name':'台湾','population':500}
#迭代器函数例子1_卖包子 def prod_baozi(): for i in range(100): yield '生产包子%s'%i dqbaozi = prod_baozi() while True: print(dqbaozi.__next__()) #迭代器函数例子2_下蛋 def alex_xiadan(): li = [] for i in range(100): li.append(i) return li def alex_xiadan(): for i in range(100): yield '下蛋%s'%i res = alex_xiadan() print(res.__next__()) print(res.__next__()) print(res.__next__()) print(res.__next__()) print(res.__next__()) print(res.__next__()) print(res.__next__()) #迭代器函数3_人口普查模型,统计各省份总人数并算出各省份所占总人数比例 def get_population(): with open('人口统计', 'r', encoding='utf-8') as f: for i in f: yield i sum = 0 i = 0 dic = get_population() for i in dic: res = eval(i) print(res['population']) sum += res['population'] print('total population %s'% sum) dic = get_population() for i in dic: subres = eval(i) print('每个省的人口占总人口的%s %%' % round((100*subres['population']/sum),5))
5.列表解析和生成数函数,两种模型生成迭代器,再进行next方法(附加列表解析翻版(圆括号生成器表达式))
#列表解析 laomuji = ['鸡蛋%s'%i for i in range(10)] print(laomuji) #圆括号生成器表达式 l = [1,2,3,4,5] print(sum(i for i in l)) #生成器函数 l = [1,2,3,4,5] def test(): yield l g = test() print(g.__next__())
6.day018复习
# 3.6 day019 s = '老男孩' print(type(s)) a = bytes(s,'utf-8') b = s.encode('utf-8') print(a,b) num = 12 a = bin(num) b = oct(num) c = hex(num) print(a,b,c) l1 = ['alex',22,33,44,55] l2 = ['is',22,33,44,55] l3 = ['good',22,33,44,55] l4 = ['guy',22,33,44,55] res = '_'.join(list(zip(l1,l2,l3,l4))[0]) print(res) NAMELIST = ['ALEX','ERIC'] def func(): global NAMELIST NAMELIST = 23 func() print(NAMELIST) def digui(n): if n == 1: return n else: return n*digui(n-1) res = digui(7) print(res) # 递归 from functools import reduce print(reduce(lambda x,y:x*y,[x for x in range(1,8)],2)) #列表解析 默认初值是1,可以人为赋初值 # 打开两个文件,一读一写 with open('a.txt','r') as x,open('abc.txt','w') as y: y.write(x.read()) #回顾day019内容 #1没有真正的集合,没有内存限制 #2不调用next()或__next__(),迭代器不进行迭代,有延迟加载功能 #3迭代器停留在一个状态时,可进行一些操作,然后进行下一个状态或维持状态不变。 #两种生成器 1列表生成式(进一步发展可到(x for x in range(0,10)形式)) 2生成器函数 #生成器协议 #迭代器协议 def test(): for i in range(0,4): yield i t = test() t1 = (i for i in t) #生成器已迭代完成,结束 t2 = (i for i in t1) print(list(t1)) print(list(t2))