31永久存储pickle模块

一、pickle模块
0、pickle的实质是什么?
  a.将对象数据以二进制形式保存在文件中
  b.将对象数据以二进制形式从文件中读取
  输入输出二进制流
1、使用pickle的什么方法存储数据?
  pickle.dump(my_list , file_pickle)
2、使用pickle的什么方法读取数据?
   my_list2 = pickle.load(file_pickle)
3、使用pickle能不能保存为”*.txt”类型的文件?
  可以,后缀名可以任意指定,只不过用文本编辑器打开时,是乱码。

二、课后题
0、编写一个程序,这次要求使用pickle将文件( record.txt (1.1 KB, 下载次数: 3988) )里的对话按照以下要求腌制成不同文件(没错,是第29讲的内容小改,考考你自己能写出来吗?):
  解题思路:
  小甲鱼的对话单独保存为boy_.txt的文件(去掉“小甲鱼:”)
  小客服的对话单独保存为girl_.txt的文件(去掉“小客服:”)
  文件中总共有三段对话,分别保存为boy_1.txt, girl_1.txt,boy_2.txt, girl_2.txt, boy_3.txt, gril_3.txt共6个文件(提示:文件中不同的对话间已经使用“==========”分割)

def fun2(count,boy,girl) :name_boy = '31作业0boy_' + str(count) + '.pkl'name_girl = '31作业0girl_' + str(count) + '.pkl'file_boy = open(name_boy,'wb')file_girl = open(name_girl,'wb')pickle.dump(boy,file_boy)pickle.dump(girl,file_girl)file_boy.close()file_girl.close()import pickledef fun1() :file = open('31作业0record.txt','r')boy = []girl = []count = 1for i in file :if i[:6] != '======' :#去掉小甲鱼小客服(name,say) = i.split(':',1)if name == '小甲鱼':boy.append(say)else :girl.append(say)else :#fenwenjianfun2(count,boy,girl)boy = []girl = []count += 1fun2(count,boy,girl)file.close()

32异常(exception)处理0

一、异常类型
  见标准异常总结

33异常(exception)处理1

一、try-except 语句
1.格式:

try :被检测的代码(检测范围)
except Exception [as reason] :出现异常(Exception)时的处理代码

2.语句执行
  try语句中的错误一旦被发现,检测范围内后面的语句不会被执行。

3.搭配
  一个try语句可以和多个except语句搭配,except可以和多种异常类型搭配,处理多种异常。

try :被检测的代码(检测范围)
except Exception1 [as reason] :出现异常(Exception1)时的处理代码
except Exception2 [as reason] :出现异常(Exception2)时的处理代码

4.统一处理多类异常
  只要出现的括号里的异常,都会执行except后的异常处理程序。

try :被检测的代码(检测范围)
except (Exception1, Exception2, Exception3…) as e :出现异常(Exception1,Exception2,Exception3)时的处理代码

二、try-finally 语句
1.格式:

try:检测范围
except 异常类型 [as e]:对应异常的处理程序
finally:无论如何都会执行的代码

三、raise语句
1.作用
可以手动引出异常。

2.格式:

raise 异常类型('自己输入的注释')

四、课后题
0、还记得我们额小游戏吗?只要用户输入非整形数据,程序立刻就会蹦出不和谐的异常信息然后奔溃。请使用刚学的异常处理方法修改以下程序,提高用户体验。

import random
secret = random.randint(1,10)
i = 3
while True:try :temp = input("猜一猜Allen心中的数字:")  number = int(temp)breakexcept ValueError :print('必须输入数字:')while (i > 0):if(number == secret):print("哇,你是Allen肚里的蛔虫吗?")print("奖励一个香吻!")breakelse:if number > secret:print("大了大了!")else:print("小了小了!")if i > 1:while True:try :temp = input("哎呀!再猜猜看:")  number = int(temp)breakexcept ValueError :print('必须输入数字:')  i = i -1
print("游戏结束,不玩啦!")

1、input()函数有可能产生两类异常:EOFError(文件末尾endoffile,当用户按下组合键Ctrl+d产生)和KeyboardInterrupt(取消输入,当用户按下组合键Ctrl+c产生),再次修改上边的代码,捕获处理input()的两类异常,提高用户体验。

import random
secret = random.randint(1,10)
i = 3
while True :try :temp = input("猜一猜Allen心中的数字:")  number = int(temp)breakexcept (ValueError, EOFError, KeyboardInterrupt) as reason:print('类型错误:' + str(reason))while (i > 0):if(number == secret):print("哇,你是Allen肚里的蛔虫吗?")print("奖励一个香吻!")breakelse:if number > secret:print("大了大了!")else:print("小了小了!")if i > 1:while True :try :temp = input("猜一猜Allen心中的数字:")  number = int(temp)breakexcept (ValueError, EOFError, KeyboardInterrupt) as reason:print('类型错误:' + str(reason))i = i -1
print("游戏结束,不玩啦!")

2、尝试一个新的函数int_input(),当用户输入整数的时候正常返回,否则提示出错并要求重新输入。程序实现如图:

def int_input():while True :try :temp = input('请输入一个整数:')num = int(temp)breakexcept (ValueError,EOFError,KeyboardInterrupt) as reason :print('类型错误:' + str(reason))

3、把文件关闭放在finally语句块中执行还是会出现问题,像下边这个代码,当前文件夹中并不存在“My_File.txt”这个文件,那么程序执行起来会发生什么事情呢?你有办法解决这个问题吗?
  问题代码:

try:  f = open('My_File.txt') #当前文件夹中并不存在“My_File.txt”这个文件  print(f.read())
except OSError as reason:  print('出错啦:' + str(reason))
finally: f.close()

出现异常,因为试图关闭一个不存在的文件对象:

================== RESTART: I:\Python\小甲鱼\test003\test0.py ==================
出错啦:[Errno 2] No such file or directory: 'My_File.txt'
Traceback (most recent call last):File "I:\Python\小甲鱼\test003\test0.py", line 7, in <module>f.close()
NameError: name 'f' is not defined

正确代码:

try:f = open('My_File.txt') #当前文件夹中并不存在“My_File.txt”这个文件print(f.read())
except OSError as reason:print('出错啦:' + str(reason))
finally:if 'f' in locals():     #如果文件对象变量存在当前局部变量符号表的话,说明打开成功f.close()

34else和with语句

一、丰富的else语句

  1. 与if语句连用
  2. 与while或for连用
      当循环语句结束时,执行else语句的内容;如果循环过程中采用break跳出循环,则不执行else语句内容。
  3. 与异常语句搭配
    如果try语句中没有异常,那么执行else语句内容。
try :int('qwerdf') #有异常
except ValueError :print('出错了!')
else :print('没有出错!')#不执行

二、简单的with语句
  使用with语句可以省略f.close()步骤,如果出现异常的话,文件还会自动正常关闭,因为它无论如何都会清理当前对象。

with open('text.txt','w') as f :for i in f :print (i)

三、课后题
0、你可以换一种形式写出下边的伪代码吗?

with A() as a:with B() as b:suite

方法1:

a = A()
if ‘a‘ in locals():  #以字典类型返回当前位置的全部局部变量b = B()if ‘b‘ in locals():suite:

方法2:
  with 语句处理多个项目的时候,可以用逗号隔开写成一条语句

with A() as , B() as b:suite

1、使用 with 语句改写以下代码,让 Python 去关心文件的打开与关闭吧。

def file_compare(file1, file2):f1 = open(file1)f2 = open(file2)count = 0 # 统计行数differ = [] # 统计不一样的数目 for line1 in f1:line2 = f2.readline()count += 1if line1 != line2:differ.append(count)f1.close()f2.close()return differfile1 = input(‘请输入需要比较的头一个文件名:‘)
file2 = input(‘请输入需要比较的另一个文件名:‘)
differ = file_compare(file1, file2)
if len(differ) == 0:print(‘两个文件完全一样!‘)
else:print(‘两个文件共有【%d】处不同:‘ % len(differ))for each in differ:print(‘第 %d 行不一样‘ % each)

修改后:

def file_compare(file1, file2):count = 0 # 统计行数differ = [] # 统计不一样的数量with open(file1) as f1, open(file2) as f2:for line1 in f1:line2 = f2.readline()count += 1if line1 != line2:differ.append(count)return differ
file1 = input(‘请输入需要比较的头一个文件名:‘)
file2 = input(‘请输入需要比较的另一个文件名:‘)
differ = file_compare(file1, file2)if len(differ) == 0:print(‘两个文件完全一样!‘)
else:print(‘两个文件共有【%d】处不同:‘ % len(differ))for each in differ:print(‘第 %d 行不一样‘ % each)

2、 你可以利用异常的原理,修改下面的代码使得更高效率的实现吗?

print(‘|--- 欢迎进入通讯录程序 ---|‘)
print(‘|--- 1:查询联系人资料  ---|‘)
print(‘|--- 2:插入新的联系人  ---|‘)
print(‘|--- 3:删除已有联系人  ---|‘)
print(‘|--- 4:退出通讯录程序  ---|‘)contacts = dict()while 1:instr = int(input(‘\n请输入相关的指令代码:‘))if instr == 1:name = input(‘请输入联系人姓名:‘)if name in contacts:print(name + ‘ : ‘ + contacts[name])else:print(‘您输入的姓名不再通讯录中!‘)if instr == 2:name = input(‘请输入联系人姓名:‘)if name in contacts:print(‘您输入的姓名在通讯录中已存在 -->> ‘, end=‘‘)print(name + ‘ : ‘ + contacts[name])if input(‘是否修改用户资料(YES/NO):‘) == ‘YES‘:contacts[name] = input(‘请输入用户联系电话:‘)else:contacts[name] = input(‘请输入用户联系电话:‘)if instr == 3:name = input(‘请输入联系人姓名:‘)if name in contacts:del(contacts[name])         # 也可以使用dict.pop()else:print(‘您输入的联系人不存在。‘)if instr == 4:break
print(‘|--- 感谢使用通讯录程序 ---|‘)

修改后:

print('|--- 欢迎进入通讯录程序 ---|')
print('|--- 1:查询联系人资料  ---|')
print('|--- 2:插入新的联系人  ---|')
print('|--- 3:删除已有联系人  ---|')
print('|--- 4:退出通讯录程序  ---|')contacts = dict()while 1:instr = int(input('\n请输入相关的指令代码:'))if instr == 1:name = input('请输入联系人姓名:')#if name in contacts:try :print(name + ' : ' + contacts[name])except KeyError :#else:print('您输入的姓名不再通讯录中!')if instr == 2: name = input('请输入联系人姓名:')#if name in contacts:try :#print('您输入的姓名在通讯录中已存在 -->> ', end='')print(name + ' : ' + contacts[name])print('您输入的姓名在通讯录中已存在 -->> ', end='')if input('是否修改用户资料(YES/NO):') == 'YES':contacts[name] = input('请输入用户联系电话:')#else:except KeyError:contacts[name] = input('请输入用户联系电话:')if instr == 3:name = input('请输入联系人姓名:')#if name in contacts:try:del(contacts[name])         # 也可以使用dict.pop()#else:except KeyError :print('您输入的联系人不存在。')if instr == 4:break
print('|--- 感谢使用通讯录程序 ---|')

35图形用户界面入门:easygui模块

一、easygui学习文档
https://www.cnblogs.com/zhuzhubaoya/p/6398338.html

二、课后题
0.将猜数字小游戏加上界面。

import easygui as g
import randomdef Guess_the_number() :answer = random.randint(1,10)#temp = input("请输入我心中的数字(1-10):")temp = g.integerbox('不妨猜一下小甲鱼心中想的数字(0-10)','数字小游戏',upperbound=10)num = int(temp)i = 2while num != answer and i:if num > answer:g.msgbox('你还有' + str(i) + '次机会!\n小提示:数字大了!','哎呀,猜错了!','再来一次')else :g.msgbox('你还有' + str(i) + '次机会!\n小提示:数字小了!','哎呀,猜错了!','再来一次')i = i-1temp = g.integerbox('不妨猜一下小甲鱼心中想的数字(0-10)','数字小游戏',upperbound=10)num = int(temp)if num == answer:g.msgbox('你是我心里的蛔虫吗?\n哼,猜中了也没有奖励!','恭喜你!猜对了','游戏结束')else:g.msgbox('你没有机会了!\n我们没有心灵感应!','哎呀,猜错了!你没有机会了!','游戏结束')Guess_the_number()
while g.ccbox('想不想继续玩猜数字游戏','游戏提示',('再来一次','下次吧')) :Guess_the_number()g.msgbox('游戏结束!','游戏结束','OK')

1.实现一个登记用户账号信息的界面(带*必填且不能为空格)

import easygui as g
msg = '带*号的选项为必填项'
title = '账号中心'
fields = ('*用户名','*真实姓名','固定电话','*手机号码','QQ','*E-mail')
(a,b,c,d,e,f) = g.multenterbox(msg,title,fields)
while (a.strip()=='' or b.strip()=='' or d.strip()=='' or f.strip()==''):g.msgbox('带*号的选项为必填项','错误提示','重新输入')values = (a,b,c,d,e,f)(a,b,c,d,e,f) = g.multenterbox(msg,title,fields,values)
g.msgbox('用户登记完成','完成提示','结束登录')

2.提供一个文件浏览框,让用户选择需要打开的文件,打开并显示文件内容。

import easygui as g
file_site = g.fileopenbox('选择文件','文件选择框')
file = open('%s' % file_site ,'r')
text = file.read()
file.close()
g.textbox('文件内容:','显示文件','%s' % text )

3.在上一题基础上增强功能:当用户点击ok的时候,判断文件是否修改过,如果修改过,则提示覆盖保存,放弃保存,另存为,并实现相应功能。

import easygui as g
file_site = g.fileopenbox('选择文件','文件选择框')
file = open('%s' % file_site ,'r+')
text = file.read()
text1 = g.textbox('文件内容:','显示文件','%s' % text )
#easy.gui的textbox()函数会在结束时增加一个\n
text1 = text1[:len(text1)-1]if text1 != text :choice = g.choicebox('检测到文件发生修改,请选择以下操作:','警告',('覆盖保存','放弃保存','另存为'))if choice == '覆盖保存':file.seek(0,0)file.write(text1)file.close()g.msgbox('覆盖保存完成','覆盖保存','结束')elif choice == '放弃保存' :file.close()g.msgbox('放弃保存完成','放弃保存','结束')else :file.close()file_new_path = g.filesavebox('选择保存目录','另存为','35作业3newtext.txt')#file_new_path += '\newtxt.txt'file_new  = open('%s' % file_new_path ,'w')file_new.write(text1)file_new.close()g.msgbox('另存为完成','另存为','结束')else :file.close()g.msgbox('文件未修改','退出','结束')

4.统计当前代码量的总和,并显示离十万行还有多远。
  要求1 :递归搜索各个文件夹
  要求2:显示各个类型的源文件和源代码行数
  要求3:显示总行数和百分比

import easygui as g
import os
import os.pathdef Statistics_code_amount(path): #(path,all_count,file_count) :os.chdir(path)list_dir = os.listdir('.')# target = ['.c','.cpp','.py','.cc','.java','.pas','.asm']for i in list_dir :if os.path.isdir(i) :Statistics_code_amount(i)  #(i,all_count,file_count)else :(f_name,f_extension) = os.path.splitext(i)for each in range(7):if f_extension == target[each]:file_count[each] += 1file = open(i,'r')count = 0try :for j in file :count += 1except UnicodeDecodeError :continueall_count[each] += countall_count[7] += countfile.close()os.chdir('..')#return all_count,file_countdef Display_text():#(all_count,file_count) :msg = '您目前积累编写了%d行代码,完成进度:%d'%(all_count[7],all_count[7]/1000)+'%'+'\n离10万行代码还差%d行,请继续努力'%(100000-all_count[7])title = '统计结果'text = []for i in range(7) :text.append('【%s】源文件%d个,源代码%d行。\n'% (target[i],file_count[i],all_count[i])) g.textbox(msg,title,text)dir_path = g.diropenbox('请选择您的代码库','浏览文件夹')
all_count = [0,0,0,0,0,0,0,0]
file_count = [0,0,0,0,0,0,0]
target = ['.c','.cpp','.py','.cc','.java','.pas','.asm']Statistics_code_amount(dir_path)#(dir_path,all_count,file_count)
Display_text()#(all_count,file_count)

Python小甲鱼学习笔记31-35相关推荐

  1. Python小甲鱼学习笔记11-15

    11列表2 一.从列表中获取元素 >>> member = ['筛子','披萨'] >>> member[0] '筛子' >>> member[1 ...

  2. python 小甲鱼——面向对象笔记

    一. 对象=属性+方法 二. self是什么? 三. _ _init __()方法--构造方法 四. 继承 五. 使用super函数 六. 多重继承 七. 组合--(注:类经常被跨模块(文件)组合) ...

  3. python小甲鱼笔记

    提示:python小甲鱼笔记 文章目录 前言 〇.函数 1.常用基本函数 2.常用表函数 3.常用子函数 4.输入.输出 5.字符串函数 5.快捷键 一.常用函数案例 1.文本输出 2.猜数 if 实 ...

  4. 【Python】办公篇-《极客Python之效率革命》(小甲鱼) 笔记一

    〇.前情提要 学习小甲鱼的使用Python读写Excel文件.这是上篇. 参考: [办公篇]<极客Python之效率革命>(小甲鱼)https://www.bilibili.com/vid ...

  5. (第二版)零基础入门Python小甲鱼-笔记-第三章-p5

    (第二版)零基础入门Python小甲鱼-笔记-第三章-p5 变量和字符串(下) 上节课讲了有些字符比如换行符.TAB制表符还有单引号.双引号等等...可以通过转义字符来实现,今天来谈谈原始字符串 1. ...

  6. 【小盐巴学习笔记】—美团吃饭哪家强?Python词云分析告诉你

    [小盐巴学习笔记]-美团吃饭哪家强?Python词云分析告诉你 效果图 前言 一.爬虫分析 1.分析网址 2.分析数据 二.完整代码 1.爬取美团牛排店评论 2.绘制词云图 3.词云分析 总结 效果图 ...

  7. 熊猫的python小课_朋友圈里那个可爱的小熊猫Python编程的学习笔记,学编程,不难!...

    Print( ) 详细请见公众号文章,里面有让人印象深刻,无法忘记的灵魂画手的图画解释.朋友圈里那个可爱的小熊猫Python编程的学习笔记,学编程,不难!​mp.weixin.qq.com 人类有人类 ...

  8. python数据分析入门学习笔记

    python数据分析入门学习笔记儿 学习利用python进行数据分析的笔记儿&下星期二内部交流会要讲的内容,一并分享给大家.博主粗心大意,有什么不对的地方欢迎指正~还有许多尚待完善的地方,待我 ...

  9. 大数据第二阶段Python基础编程学习笔记(待完善)

    大数据第二阶段Python基础编程学习笔记(待完善) 第一章 Python基础语法 3.8 1-1Python概述 python基础部分: ●Python基础语法: 标识符,关键字,变量,判断循环.. ...

最新文章

  1. 疯狂python讲义
  2. 浏览器中唤起native app || 跳转到应用商城下载(二) 之universal links
  3. android 之ViewStub
  4. 数字图像处理技术在TWaver可视化中的应用
  5. 捡到东西说给钱才给东西?算不算敲诈勒索……
  6. LeetCode 56. 合并区间(优先队列)
  7. 作者:王文生,中国农业科学院农业信息研究所副所长、研究员。
  8. monodevelp注释显示中文
  9. [洛谷P3242] [HNOI2015]接水果
  10. nginx动态php转发,Nginx 动态 upstreams 实现,nginxupstreams_PHP教程
  11. IE游览器的扩展事件
  12. 信号与线性系统分析(吴大正,郭宝龙)(2-冲激函数)
  13. 词法分析器java_java词法分析器简单实现
  14. R语言manova函数多元方差分析(MANOVA)、单因素多元方差分析的两个假设是多元正态性和方差-协方差矩阵的齐性、QQ图评估多元正态性、mvoutlier包中的aq.plot函数检验多变量异常值
  15. 页式存储系统的逻辑地址是由页号和页内地址两部分组成的
  16. python使用OpenCV批量裁剪图片
  17. 人生励志语录 排比句
  18. python多台电脑聊天室_python的多人多功能聊天室
  19. 信息系统项目管理师(杂)
  20. 检测网络连接是否正常的方法

热门文章

  1. DNA甲基化重编程为红梨中光诱导的花青素生物合成提供了见解
  2. AJMJ面包服146/羽绒被79/长虹电暖气109/积雪草面膜19.9/40条蓝山咖啡9.9/洗牙神器/啄木鸟针织衫...
  3. 用计算机编辑文档教学建议,用计算机写文章.doc
  4. java十六进制转十进制_java十六进制转十进制
  5. 药品初级包装标签-市场现状及未来发展趋势
  6. 深圳的中学计算机课学什么时候,AP 计算机 专业高效 深圳中学学生如何说
  7. 详解数仓中的数据分层:ODS、DWD、DWM、DWS、ADS
  8. 邢台比较好的计算机学校,谁知道邢台哪所计算机学校好啊
  9. 修改Typora编辑器的字体
  10. 2022速卖通开店费用详解