(本文仅作为学习记录使用)
01 昨日内容回顾
02 作业讲解
03 编码的进阶
04 文件操作的初识
05 文件的读
06 文件的写
07 文件的追加
08 其他操作方法
09 文件的改
10 深浅copy
01 昨日内容回顾
小数据池:
数据类型的补充:
集合的一些定义和概念:
小数据池:
id 是获取该对象的内存地址. 如果内存地址相同则代表指向的元素相同.
is 是确保两者之间的id是否相同.
== 是判断两边的数值是否相等.
同一代码块的缓存机制:如果是同一代码块,那么赋值相同的变量id相同. 改变其中一个值,另一个也会发生变化.
不同代码块:(小数据池)即使是赋值相同,id不同,那也无能为力.改变其中一个值,另一个不会发生变化.(-5~256之间还是相同的)
数据类型的补充:
空值('')的bool是False.
bool,str,bool可以相互转化.(各有条件)
用fromkeys时,如果赋值是可变的,那么id相同.(如果是不可变类型的数据,id不同)
tuple单个元素时候是其本身,类型不变. 2个元素以上的如(a,b)为元组.
#fromkeys() #说明:用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值''' >>> help(dict.fromkeys) Help on built-in function fromkeys: fromkeys(...) dict.fromkeys(S[v]) -> New dict with keys from S and values equal to v. v defaults to None. '''
formkeys用法:
dic = dict.fromkeys([1,2,3],'太白')
dic = dict.fromkeys('abcd','太白')
dic = dict.fromkeys('abcd',[1,])
# 坑: 如果你的值是一个可变的数据类型, 他在内存中是一个.id相同.
dic = dict.fromkeys('abcd',[])
dic['a'].append(666)
dic['b'].append(111)
dic['c'].append(222)
print(dic)
tuple注意事项:
t = (1)
print(type(t))#<class 'int'>
t = (1,2)
print(type(t))#<class 'tuple'>
注意,有三种方法创建一个字典:
1.dic = {'k1':'v1','k2':'v2','k3':'v3'}
2.dic =dict.fromkeys()
3.dic = dict()
set:看昨日链接。https://www.cnblogs.com/smithpath/articles/10492741.html
2.作业讲解
# 用三种方式创建一个字典: # dic = {'name':'太白','age': 18} # # dic = dict([(1,2),('name', 'alex')]) # print(dic) # # # dict.fromkeys() # dic = dic.fromkeys([1,2,3],'alex') # print(dic) # # dic = dict() # for 循环 构建. # 1,列表去重. # l1 = [1, 2, 3, 1, 2, 3, 4, 4,] # s1 = set(l1) # print(s1) # 21 数字之前. # l1 = list(s1) # print(l1) # 2,关系测试. # | & - ^ # Day6作业及默写 # 1. # 使⽤循环打印以下效果: # 1: # * # ** # ** * # ** ** # ** ** * # 2: # ** ** * # ** ** # ** * # ** # * # 3: # * # ** * # ** ** * # ** ** ** * # ** ** ** ** * # # 2. # 输入⼀个⼴告标语.判断这个广告是否合法.根据最新的⼴告法来判断. ⼴告法内容过 # 多.我们就判断是否包含 # '最', '第⼀', '稀缺', '国家级' # 等字样.如果包含.提⽰, ⼴告不 # 合法 # 例如, # (1) # 老男孩python世界第⼀.不合法 # (2) # 今年过年不收礼啊.收礼只收脑⽩⾦.合法 # # 3. # 敲七游戏.从1开始数数.遇到7或者7的倍数(不包含17, 27, 这种数)要在桌上敲⼀下.编程来完成敲七. # 给出⼀个任意的数字n.从1开始数.数到n结束.把每个数字都放在列表中, 在数的过程中出现7或 # 者7的倍数(不包含17, 27, 这种数).则向列表中添加⼀个 # '咣' # 例如, 输⼊10. # lst = [1, 2, 3, 4, 5, 6, '咣', 8, 9, 10] # # 4. # 念数字给出一个字典.在字典中标识出每个数字的发音.包括相关符号.然后由用户输入一个数字.让程序读出相对应的发音(不需要语音输出.单纯的打印即可) # # 5. # 电影投票程序:先给出⼀个⽬前正在上映的电影列表.由⽤户给每⼀个电影投票.最终将该⽤户投票信息公布出来 。 # 要求: # 1,用户输入序号,进行投票。比如输入序号 1,给肖申克的救赎投票1。 # 2,每次投票成功,显示给哪部电影投票成功。 # 3,退出投票程序后,要显示最终每个电影的投票数。 # lst = ['肖申克的救赎', '流浪地球', '驯龙高手3', '西西里的美丽传说'] dic = dict.fromkeys(lst,0) while 1: print('请给以下电影投票:') for index in range(len(lst)): print('电影序号:{}, 电影名称:{}'.format(index+1,lst[index])) num = input('请输入电影序号:q或者Q退出').strip() ''' q Q 退出 break 非数字元素: 重新输入. 输入数字: 对数字进行范围的判断. ''' if num.upper() == 'Q': print('感谢您参与!') break elif num.isdigit(): num = int(num) if 0 < num <= len(lst): # 1 ''' 如果要是没有肖申克的救赎这个部电影: 我要增加一个键值对,设置为 肖申克的救赎: 0 如果要是有肖申克的救赎这部电影:肖申克的救赎 对应的值 + 1 ''' # # if not dic.get(lst[num-1]): # # dic[lst[num-1]] = 1 # # else: # # dic[lst[num-1]] += 1 # dic[lst[num-1]] = dic.get(lst[num-1],0) + 1 # dic[lst[num-1]] = 1 print('您已经给{}电影投票成功'.format(lst[num-1])) else: print('您输入超出范围,重新输入') else: print('输入错误,请重新输入') for movie_name, movie_num in dic.items(): print('电影:{}最终票数:{}'.format(movie_name,movie_num)) # 结果: {'肖申克的救赎': 99, '解救吴先生': 80, '美国往事': 6, '西西里的美丽传说': 23} # # 明日默写内容: # 1,l1 = [11, 22, 33, 44, 55] # 用代码将列表的索引的偶数位对应的元素删除。 # (不能使用del # l1[::2] # 这种方法) # 2,dic = {“k1”: “v1”, “k2”: “v2”, “k3”: “v3”, “name”: “太白”} 将字典中含有k元素的所有key全部删除。
今日作业: # 1.有如下文件,a1.t面: # -------------------------------------------------------------------------------- # 老男孩是最好的学校, # 全心全意为学生服务, # 只为学生未来,不为牟利。 # 我说的都是真的。哈哈 # -------------------------------------------------------------------------------- # 分别完成以下的功能: # with open('a1.txt',encoding='utf8',mode='w') as f : # f.write('''老男孩是最好的学校,\n全心全意为学生服务,\n只为学生未来,不为牟利。\n我说的都是真的。哈哈''') # a,将原文件全部读出来并打印。 # with open('a1.txt',encoding='utf8') as f : # print(f.read()) # b,在原文件后面追加一行内容:信不信由你,反正我信了。 # 带输出: # with open('a1.txt',encoding='utf8',mode='a+') as f : # f.write('\n信不信由你,反正我信了。') # 带输出: # with open('a1.txt',encoding='utf8',mode='a+') as f : # f.write('\n信不信由你,反正我信了。') # f.seek(0) # print(f.read()) # c,将原文件全部读出来,并在后面添加一行内容:信不信由你,反正我信了。 # with open ('a1.txt',encoding='utf8',mode='r+') as f: # print(f.read()) # f.write('\n信不信由你,反正我信了。') # d,将原文件全部清空,换成下面的内容: # -------------------------------------------------------------------------------- # 每天坚持一点, # 每天努力一点, # 每天多思考一点, # 慢慢你会发现, # 你的进步越来越大。 # -------------------------------------------------------------------------------- # with open('a1.txt',encoding='utf8',mode='w') as f : # f.write('每天坚持一点,\n每天努力一点,\n每天多思考一点,\n慢慢你会发现,\n你的进步越来越大。') # 2.有如下文件,t1.txt,里面的内容为: # -------------------------------------------------------------------------------- # 葫芦娃,葫芦娃, # 一根藤上七个瓜 # 风吹雨打,都不怕, # 啦啦啦啦。 # 我可以算命,而且算的特别准: # 上面的内容你肯定是心里默唱出来的,对不对?哈哈 # -------------------------------------------------------------------------------- # 分别完成下面的功能: # with open('t1.txt', encoding='utf8', mode='w') as f: # f.write('葫芦娃,葫芦娃,\n一根藤上七个瓜\n风吹雨打,都不怕,\n啦啦啦啦。\n我可以算命,而且算的特别准:\n上面的内容你肯定是心里默唱出来的,对不对?哈哈') # a,以r+的模式打开原文件,判断原文件是否可读,是否可写。 # with open('t1.txt', encoding='utf8', mode='r+') as f: # print(f.readable()) # print(f.writable()) # b,以r的模式打开原文件,利用for循环遍历文件句柄。 # with open('t1.txt',encoding='utf8',) as f: # for i in f: # print(i) # c,以r的模式打开原文件,以readlines()方法读取出来,并循环遍历 readlines(), # 并分析b,与c 有什么区别?深入理解文件句柄与readlines()结果的区别。 # with open('t1.txt', encoding='utf8') as f: # for i in f.readlines(): # print(i) # read:如果指定了参数 size,就按照该指定长度从文件中读取内容,否则,就读取全文。 # 被读出来的内容,全部塞到一个字符串里面。这样有好处,就是东西都到内存里面了,随时取用;但如果文件内容太多了,内存会吃不消 # # • readline:可选参数 size 的含义同上。它是以行为单位返回字符串, # 也就是每次读一行,依次循环,如果不限定 size,直到最后一个返回的是空字符串,意味着到文件末尾了(EOF)。 # # • readlines:size 同上。它返回的是以行为单位的列表, # 即相当于先执行 readline() ,得到每一行,然后把这一行的字符串作为列表中的元素塞到一个列表中,最后将此列表返回。 # b的话是遍历文件中的str. c的话是遍历文件中每一句话. # readlines打印出来有\n,read没有. # d,以r模式读取'葫芦娃,'前四个字符。 # with open('t1.txt',encoding='utf8') as f: # print(f.read(4)) # e,以r模式读取第一行内容,并去除此行前后的空格,制表符,换行符。 # with open('t1.txt',encoding='utf8') as f: # print(f.readline().strip()) # f,以r模式打开文件,从'风吹雨打.....'开始读取,一直读到最后。 # 法一:数出来 # with open('t1.txt', encoding='utf8') as f: # f.seek(43) # print(f.read()) # 法二: # with open('t1.txt', encoding='utf8') as f: # for i in f : # if '风吹雨打' in i : # print(i,end='') # print(f.read()) # 法三: # with open('t1.txt', encoding='utf-8', mode='r') as f: # for line in f.readlines()[2:]: # print(line,end='') # g,以a+模式打开文件,先追加一行:'老男孩教育'然后在从最开始将原内容全部读取出来。 # with open('t1.txt',encoding='utf8',mode='a+') as f : # f.write('\n老男孩教育') # f.seek(0) # print(f.read()) # h,截取原文件,截取内容:'葫芦娃,葫芦娃,' # with open('t1.txt',encoding='utf8',mode='r+') as f : # f.truncate(22) # 3.文件a.txt内容:每一行内容分别为商品名字,价钱,个数。 # -------------------------------------------------------------------------------- # apple 10 3 # tesla 100000 1 # mac 3000 2 # lenovo 30000 3 # chicken 10 3 # -------------------------------------------------------------------------------- # 通过代码,将其构建成这种数据类型:[{'name': 'apple', 'price': 10, 'amount': 3}, # {'name': 'tesla', 'price': 1000000, 'amount': 1}......] # 并计算出总价钱。 # 老师写的: # with open('a.txt', encoding='utf8', mode='w') as f: # f.write('name\tprice\tamount\napple\t10\t\t3\ntesla\t100000\t1\nmac\t\t3000\t2\nlenovo\t30000\t3\nchicken\t10\t\t3') # li = [] # num_sum = 0 # with open('a.txt', encoding='utf8') as f: # for i in f: # name, price, num = i.split() # print(name, price, num) # dic = {'name':name,'price':price,'num':num} # li.append(dic) # sum =int( price )* int(num) # num_sum += sum # print(li) # print(num_sum) # 原答案: # with open('a.txt', encoding='utf8', mode='w') as f: # f.write('name\tprice\tamount\napple\t10\t\t3\ntesla\t100000\t1\nmac\t\t3000\t2\n' # 'lenovo\t30000\t3\nchicken\t10\t\t3') # with open('a.txt', encoding='utf8') as f: # l = [] # for line in f.readlines(): # l.append(line.strip().split()) # dic1 = dict(zip(l[0], l[1])) # dic2 = dict(zip(l[0], l[2])) # dic3 = dict(zip(l[0], l[3])) # dic4 = dict(zip(l[0], l[4])) # sum1 = int(dic1['price']) * int(dic1['amount']) # sum2 = int(dic2['price']) * int(dic2['amount']) # sum3 = int(dic3['price']) * int(dic3['amount']) # sum4 = int(dic4['price']) * int(dic4['amount']) # sum = sum1 + sum2 + sum3 + sum4 # print(dic1, dic2, dic3, dic4,sum) # 4.有如下文件: # alex是老男孩python发起人,创建人。 # alex其实是人妖。 # 谁说alex是sb? # 你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。 # -------------------------------------------------------------------------------- # 将文件中所有的alex都替换成大写的SB(文件的改的操作)。 # 五步: # 1.以读的模式打开原文件. # 2.以写的模式打开新文件. # 3.将原文件内容读取出来,按照你的要求改成新内容,写入新文件. # 4.删除原文件. # 5.把新文件名改为原文件. # with open('a1', encoding='utf8', mode='w') as f1: # f1.write('alex是老男孩python发起人,创建人。\nalex其实是人妖。\n谁说alex是sb?\n你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。') # import os # with open('a1', encoding='utf8') as f1,\ # open('a1.bak', encoding='utf8', mode='w') as f2: # for old_conment in f1: # new_conment = old_conment.replace('alex', 'sb') # f2.write(new_conment) # os.remove('a1') # os.rename('a1.bak','a1') # 5.文件a1.txt内容(升级题) # -------------------------------------------------------------------------------- # name: apple price: 10 amount: 3 year: 2012 # name: tesla price: 100000 amount: 1 year: 2013 # -------------------------------------------------------------------------------- # -------------------------------------------------------------------------------- # ....... # -------------------------------------------------------------------------------- # 通过代码,将其构建成这种数据类型: # [{'name': 'apple', 'price': 10, 'amount': 3, year: 2012}, # {'name': 'tesla', 'price': 1000000, 'amount': 1}......] # 并计算出总价钱。 # 老师讲的 # 自己做的 # l = [] # with open('a2', encoding='utf8', mode='r+') as f: # for i in f.readlines(): # l1 = i.strip().split() # print(l) # 6.文件a1.txt内容(升级题) # 序号 部⻔ 人数 平均年龄 备注 # 1 python 30 26 单身狗 # 2 Linux 26 30 没对象 # 3 运营部 20 24 女生多 # ....... # 通过代码,将其构建成这种数据类型: # [{'序号': '1', '部⻔': Python, '人数': 30, '平均年龄': 26, '备注': '单身狗'}, # ......] # 老师讲的 # l = [] # with open('t', encoding='utf8') as f: # title_list = f.readline().split() # for i in f: # em = i.split() # d = {title_list[0]: em[0], # title_list[1]: em[1], # title_list[2]: em[2], # title_list[3]: em[3], # title_list[4]: em[4]} # l.append(d) # print(l) # 明日默写内容: # 就是第4题的代码(课上讲过)。
03.编码进阶
侧重于encode和decode的理解。
encode:编码。 decode:解码。
在Python3x版本中,s1 = '老男孩',如何将s1转化成utf-8的bytes 类型?转化成功之后,得到了s2,如何将s2转化成gbk的bytes类型(请写出具体代码)?
s1 = "老男孩"
s2 = s1.encode("utf-8")
s3 = bs.decode("utf-8")
bs2 = s2.encode("gbk")
04.文件操作的初识
f.tell() #获取文件中当前“光标”位置
f.seek(5) #光标定位到指定位置
f.encoding #当前文件的编码格式
f.fileno() #返回文件在内存中的编号
f.name #当前打开文件的文件名
f.seekable() #判断光标在文件是否可移动
f.readable() #判断文件是否可读
f.writable() #判断文件是否可写
f.flush() #强制刷新,把内存里的内容立即写入硬盘
f.truncate(10) #从第10个字符开始清除后面数据
f.close() #关闭文件,文件读取结束自动关闭
05.文件的读、写和追加
r:读模式;
w:写模式;
a:追加模式,在文件最后写入内容;
r+:读写模式,读取文件内容,并在末尾添加记录;
w+:写读模式,新建文件并添加记录;
a+:追加写读;
rb:以二进制格式读取文件;(可打开图片等非文字文件)
rw:以二进制格式写入文件(可打开图片等非文字文件)
注:读模式时,不能写,写模式时,不能读。
r模式: n 字符
rb模式: n 字节
文件的读: f1 = open('r模式',encoding='utf-8') print(f1.read(3)) f1.close() f1 = open('r模式',mode='rb') print(f1.read(3)) f1.close()
文件的写: f = open('w模式',encoding='utf-8',mode='w') # f.write('alex is a man\n') f1 = open('美女.jpg',mode='rb') content = f1.read() f1.close() f2 = open('美女1.jpg',mode='wb') f2.write(content) f2.close()
09.文件的改
import os
with open('alex自述',encoding='utf-8') as f1,\
open('alex自述.bak',encoding='utf-8',mode='w') as f2:
for old_line in f1:
new_line = old_line.replace('alex','sb')
f2.write(new_line)
os.remove('alex自述')
os.rename('alex自述.bak','alex自述')
10.深浅copy
Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 这个是由于共享内存导致的结果
拷贝:原则上就是把数据分离出来,复制其数据,并以后修改互不影响。
先看 一个非拷贝的例子
=赋值:数据完全共享(=赋值是在内存中指向同一个对象,如果是可变(mutable)类型,比如列表,修改其中一个,另一个必定改变
如果是不可变类型(immutable),比如字符串,修改了其中一个,另一个并不会变
浅拷贝:数据半共享(复制其数据独立内存存放,但是只拷贝成功第一层)
深拷贝:数据完全不共享(复制其数据完完全全放独立的一个内存,完全拷贝,数据不共享)
深拷贝就是完完全全复制了一份,且数据不会互相影响,因为内存不共享。