029~030 文件和模块
-
一个任务:
-
record.txt
-
代码如下:
-
注意点:file.writelines方法是写入一个序列到指定的file中,序列之前说过可以是字符串、列表、元组。
-
string.split()方法是返回字符串中的字符串列表,使用第一个参数作为分隔符字符串
-
封装函数后的代码如下
-
-
-
文件系统:介绍跟文件有关的模块
-
模块简介:
- 当我们使用randint函数时,我们必须要导入random这个模块才能使用,否则会报错
- 模块就是可用代码的一个打包,模块是包含所有我定义的函数和变量的文件,文件后缀是.py,模块可以被别的程序引入,使用import关键字,就可以使用该模块中函数的功能。
-
OS模块:Operating System操作系统模块
OS模块中关于文件/目录常用的函数使用方法
-
os.path模块中关于路径常用的函数使用方法
那我们在windos写好的代码(操作文件的)用在linux上面,是不是需要重新修改呢?
不需要的,因为Python是一个跨平台的语言,也就是同样的源代码在不同的操作系统上都可以实现。
我们只需要使用这个OS模块,不需要担心在什么操作系统上,因为对应不同的操作系统,OS模块内部 已经给我们做好了相应转化的操作。
-
OS模块常用的方法(使用前必须先导入)
>>> import os >>> os.getcwd()#获取当前工作空间路径 'C:\\Jin\\Python3.8' >>> os.listdir("E:\\")#列出指定目录下的目录 ['$360RTLOG$', '$360RTSYS$', '$RECYCLE.BIN', '80C51', 'AdobePremiereCC', 'Altium Designer 14.1.5.30772', 'AutoIt', 'autoit3', 'backup', 'BaiduNetdiskDownload', 'Download', 'DreamWeaver8', 'DriverBackUp', 'Exe4j', 'FFOutput', 'Fish-v326', 'Foxit Reader', 'imx6', 'Java', 'javaJDK', 'KeiluVision4', 'LochMaster40', 'MDK5', 'Mindjet MindManager', 'MSDN', 'MSOCache', 'MySQL Datafiles', 'OpenCV4.0', 'PhotoShopcs5', 'Program Files', 'Program Files (x86)', 'QMDownload', 'QQLive', 'SQLyog 12.09X64', 'STM32CubeMX', 'STM32资料', 'System Volume Information', 'USART HMI', 'WPS', '__Previews', '专业', '专业软件', '专业软件设计作业', '格式工厂', '阿里旺旺'] >>> os.mkdir("E:\\A")#创建单层目录 >>> os.makedirs("E:\\A\\B")#创建多层目录 >>> os.remove("E:\\A\\test.txt")#删除文件 >>> os.rmdir("E:\\A\\B")#删除单层目录 >>> os.removedirs("E:\\A\\test.txt")#删除多层目录 >>> os.rename("E:\\A\\test.txt","E:\\A\\a.txt")#将第一个参数的文件名重命名为第二个参数 >>> os.system("cmd")#运行系统的shell命令 >>> os.path.basename("E:A\\B\\sax.png")#去掉目录路径,单独返回文件名 'sax.png' >>> os.path.dirname("E:A\\B\\sax.png")#去掉文件名,单独返回路径 'E:A\\B' >>> os.path.join("a","b","c")#将所有参数对应的名称组合成一个路径名 'a\\b\\c' #看截图
-
031永久存储
永久存储的目的就是将一些比较多的数据存储成二进制文件的形式,等到我们要用的时候再进行读取二进制文件。
假如说我们要存储一些例如列表的东西,用file对象进行存储的话还需要先进行转换字符串然后写入,而且读取的话读取的是字符串,还需要进行转换才能变成序列啥的。Python给我们提供了一个pickle模块(泡菜),使用它存储数据可以直接存储序列,而且读取的时候直接返回的也是序列。
-
pickle模块
-
注意点:使用pickle模块的时候要先导入pickle模块,然后再使用文件对象打开文件时,写入数据必须是二进制写入"wb"模式,读取数据必须是二进制读取"rb"模式。
-
举例
>>> import pickle >>> my_list = [123,3.14,"小甲鱼",["其他列表"]] >>> pickle_file = open("my_list.pkl","wb") >>> pickle.dump(my_list,pickle_file) >>> pickle_file.close() >>> pickle_file = open("my_list.pkl","rb") >>> my_list2 = pickle.load(pickle_file) >>> print(my_list2) [123, 3.14, '小甲鱼', ['其他列表']]
-
032~033异常处理
-
Exception异常机制
-
跟Java的异常处理机制是一样的
-
举例文件系统的异常处理
>>> file = open("E:\\a.txt") Traceback (most recent call last): File "<pyshell#14>", line 1, in <module> file = open("E:\\a.txt") FileNotFoundError: [Errno 2] No such file or directory: 'E:\\a.txt'
- 他不会导致系统出现错误,而是内部自己进行了异常处理,Python的异常处理机制会帮我进行查询,因为没有a.txt这个文件,所以它内部就抛出了一个FileNotFoundError文件找不到异常
-
常会出现的异常:
-
-
怎么检测异常并处理呢?(和Java类似)
-
try-except语句
语法:
一个try可以和多个except搭配
-
示例(使用try-except语句)
f = open("我为什么是一个文件.txt")#文件不存在 print(f.read()) f.close() >>> ============= RESTART: G:/SLAM/SLAM和RPI/Python/Python代码/033/test.py ============ Traceback (most recent call last): File "G:/SLAM/SLAM和RPI/Python/Python代码/033/test.py", line 1, in <module> f = open("我为什么是一个文件.txt")#文件不存在 FileNotFoundError: [Errno 2] No such file or directory: '我为什么是一个文件.txt' -------------------------------------------------------------------------------- try: f = open("我为什么是一个文件.txt")#文件不存在 print(f.read()) f.close() except OSError: print("文件出错咯") >>> ============= RESTART: G:/SLAM/SLAM和RPI/Python/Python代码/033/test.py ============ 文件出错咯
- 一个try搭配多个except语句,使用as reason查看原因
try: sum = 1 + '1' f = open("我为什么是一个文件.txt")#文件不存在 print(f.read()) f.close() except OSError as reason: print("文件出错咯,原因是:"+str(reason)) except TypeError as reason: print("类型出错,原因是:"+str(reason)) ============= RESTART: G:/SLAM/SLAM和RPI/Python/Python代码/033/test.py ============ 类型出错,原因是:unsupported operand type(s) for +: 'int' and 'str' >>>
-
也可以不指定类型,只要出现异常就去excecpt下进行处理
try: sum = 1 + '1' f = open("我为什么是一个文件.txt")#文件不存在 print(f.read()) f.close() except: print("有错") ============= RESTART: G:/SLAM/SLAM和RPI/Python/Python代码/033/test.py ============ 有错
-
try语句检测到异常,下面的语句不会执行。
-
同时处理多个异常
try: sum = 1 + '1' f = open("我为什么是一个文件.txt")#文件不存在 print(f.read()) f.close() except(OSError,TypeError): print("出错了") ============= RESTART: G:/SLAM/SLAM和RPI/Python/Python代码/033/test.py ============ 出错了
-
try-except-finally:也就是如果try出现了异常,处理完异常后依然会执行的代码就写在finally里面。
比如文件,打开一个文件之后,写入数据的时候出现了异常,但我们没把文件关闭,所以此时关闭文件的代码可以写在finally里.
-
-
raise:主动抛异常
后面加异常的名字,如果不加默认就抛的是RuntimeError异常,在抛出的异常可以添加参数表明异常信息
>>> raise Traceback (most recent call last): File "<pyshell#15>", line 1, in <module> raise RuntimeError: No active exception to reraise >>> raise ZeroDivisionError Traceback (most recent call last): File "<pyshell#16>", line 1, in <module> raise ZeroDivisionError ZeroDivisionError >>> raise ZeroDivisionError("除数为0的异常") Traceback (most recent call last): File "<pyshell#17>", line 1, in <module> raise ZeroDivisionError("除数为0的异常") ZeroDivisionError: 除数为0的异常
034丰富的else语句和简介的with语句
-
之前学过的if-else他可以表示为:要么怎样,要么不怎么样
-
在python中else语句不仅可以和if语句进行搭配,还可以和while和for循环语句搭配,但esle只在循环完成后执行,也就是循环顺利完成后才会执行else,也就是说如果中途出现了break跳出了循环,那么else不会执行。表示为:干完了能怎样,干不完就别想怎样
-
while-else示例(for和else搭配类似)
-
-
与异常处理进行搭配:只要try语句里面没有出现异常,那么就会执行else语句块里的内容。表示为:没有问题,那就干吧
-
示例:
try: int("123") except ValueError as reason: print("出错了异常为:"+str(reason)) else: print("没有出现任何异常") ============= RESTART: G:/SLAM/SLAM和RPI/Python/Python代码/033/test.py ============ 没有出现任何异常 >>>
-
-
with语句,打开文件还要关闭文件,要用很多try-except
-
如果文件压根不存在,我们还在finally中关闭文件就会报错
try: f = open("asdsa.txt") except OSError as reason: print("出错了异常为:"+str(reason)) finally: f.close() ============= RESTART: G:/SLAM/SLAM和RPI/Python/Python代码/033/test.py ============ 出错了异常为:[Errno 2] No such file or directory: 'asdsa.txt' Traceback (most recent call last): File "G:/SLAM/SLAM和RPI/Python/Python代码/033/test.py", line 6, in <module> f.close() NameError: name 'f' is not defined >>>
-
这时我们就可以用with语句
-
他会去关注你这个文件什么时候用到了open,程序结束时他就会自动帮你调用close,而不需要我们自己调用
try: with open("asdsa.txt") as f: for each_line in f: print(each_line) except OSError as reason: print("出错了异常为:"+str(reason)) ============= RESTART: G:/SLAM/SLAM和RPI/Python/Python代码/033/test.py ============ 出错了异常为:[Errno 2] No such file or directory: 'asdsa.txt' >>>
-
-
035图形用户界面入门:EasyGui
-
进入网址下载:https://sourceforge.net/projects/easygui/files/0.96
- 安装步骤
- 使用命令窗口切换到easygui-docs-0.96的目录下
- 【Windows下】执行C:\Jin\Python3.8\python.exe setup.py install
- 安装步骤
-
使用EasyGui
-
>>> import easygui >>> easygui.msgbox("你好")
-
导入模块的方法
-
import easygui as g #导包 import sys while 1: g.msgbox("嗨,欢迎进入第一个界面小游戏^_^") msg ="请问你希望在鱼C工作室学习到什么知识呢?" title = "小游戏互动" choices = ["谈恋爱", "编程", "OOXX", "琴棋书画"] choice = g.choicebox(msg, title, choices) # note that we convert choice to string, in case # the user cancelled the choice, and we got None. g.msgbox("你的选择是: " + str(choice), "结果") msg = "你希望重新开始小游戏吗?" title = "请选择" if g.ccbox(msg, title): # show a Continue/Cancel dialog pass # user chose Continue else: sys.exit(0) # user chose Cancel
-
可以去修改他的源码去更改文本框的大小,字体之类的
-