异常捕获和文件操作 及 数据文件持久
-
eavl
的用法 ---- 将字符串中可以转变成 列表,字典,元组等转变成相应的类型str1 = "[10, 20, 30]" # 字符串中符合转变成列表的类型 result = eval(str1) print(result) # [10, 20, 30] print(type(result)) # <class 'list'> print(result[-1]) # 30 str2 = "{'a': 10, 'b': 20}" # 字符串中符合转变成字典的要求 result = eval(str2) print(result) # {'a': 10, 'b': 20} print(type(result)) # <class 'dict'> print(result['a']) # 10 str3 = '[abc, 10, 20, 30]' # 字符串中abc不是变量也不是字符串,就不符合,变成列表的要求,就会报错 result = eval(str3) # NameError: name 'abc' is not defined print(result)
-
异常捕获 - - - 异常捕获就是让程序在出现异常的时候不崩溃还可以接着往后执行
-
异常捕获
''' 1)语法1: - 捕获所有类型的异常 try: 代码段1(需要捕获异常的代码) except: 代码段2(捕获到异常后会执行的代码) finally: 代码段 其他代码 2)执行过程: 先执行代码段1,如果代码段1在执行过程中出现了异常,程序不会奔溃,直接执行代码段2,执行完代码段2才继续执行后续其他代码。 语法二: - 捕获指定的一种异常 try: 代码段1(需要捕获异常的代码) except 异常类型: 代码段2(捕获到异常后会执行的代码) finally: 代码段 其他代码 语法三: - 同时捕获多种异常,针对不同的异常做相同的处理 try: 代码段1(需要捕获异常的代码) except (异常类型1, 异常类型2, 异常类型3,...): 代码段2(捕获到异常后会执行的代码) finally: 代码段 其他代码 语法四:- 同时捕获多种异常,针对不同的异常做不一样的处理 try: 代码段1(需要捕获异常的代码) except 异常类型1: 代码段11 except 异常类型2: 代码段22 except 异常类型3: 代码段33 '''
-
finally
# finally后面的代码段不管被捕获的代码发生了什么都会执行(就算try后面的代码出现异常没有被捕获导致程序奔溃,finally后面的代码也会执行) try: print({'a': 10}['b']) except IndexError: print('下标越界!') finally: print('写遗书') print('其他语句') # 无论能不能捕获try的异常,都会执行 '写遗书' 这句代码
-
抛出异常 - - -
raise
异常类型age = int(input('请输入年龄:')) if age > 200 or age < 0: raise ValueError # 当年龄输入太异常,可以主动抛出值异常,或者自定义异常
-
-
文件操作
-
数据持久化(数据本地方)
# 默认情况下程序中的数据都是保存在运行内存中,运行内存中是数据在程序结束的时候会自动销毁 # 如果希望程序结束后数据不销毁就必须将数据以文件的形式保存在硬盘中。 # 常用的文件格式:数据库文件(sqlit、db)、json文件(.json)、plist文件(.plist)、表格文件(xls、xlsx、csv)、二进制文件(图片、视频、音频)、普通文件(txt)
-
文件操作(文件内容的操作) -
I/O操作
基本步骤:打开文件 -> 操作文件(读、写) -> 关闭文件
-
打开文件 (
open(file, mode='r', *, encoding=None)
)""" open(file, mode='r', *, encoding=None) - 以指定模式打开指定文件,并且返回文件对象 file - 需要打开的文件在计算机中的位置(文件路径) 绝对路径:文件在计算机中全路径(/Users/yuting/授课/Python2102/01语言基础/day13-异常捕获和文件操作/test.txt) 相对路径:在写路径的时候用一个点或者多个点来表示文件绝对路径的一部分 . - 表示当前目录(当前目录指的时候当前写代码的文件所在的目录), .. - 表示当前目录的上层目录 ... - 表示当前目录的上层目录的上层目录 注意:如果只有一个点,这个点可以省略 mode - 决定打开文件后能进行的操作是读还是写?同时决定操作文件的时候对应数据的类型是字符串还是二进制 (mode需要两个值) 第一类值:控制读写 r - 只读(默认); 如果打开的文件不存在会报错FileNotFoundError w - 只写;会清空原文件中的内容;如果打开的文件不存在,不报错并且自动创建对应的文件(如果路径中的文件夹不存在会报错) a - 只写;会保留原文件中的内容;如果打开的文件不存在,不报错并且自动创建对应的文件(如果路径中的文件夹不存在会报错) 第二类值:控制操作数据的类型 t - 文本模式,对应的数据类型是str (文本文件才可以使用t来打开)(默认) b - 二进制模式,对应的数据类型是bytes 案例:rt、tr、r; rb、br; wt、tw、w; wb、bw; at、ta、a; ab、ba encoding - 设置文本文件的编码方式(只能在以t的模式打开文本文件的时候才需要设置) 一般设置成utf-8,原则是:对同一个文件进行读和写的时候打开时对应的编码方式要一致 """ # 打开不存在的文件 # f = open('./test2.txt', 'r') # FileNotFoundError: [Errno 2] No such file or directory: './test2.txt' r读模式读的文件不存在会报错 # f = open('./test2.txt', 'w') # w写模式 写的文件不存在不会报错,会新建一个同样文件名的文件 # f = open('./test3.txt', 'a', encoding='utf-8') # a写模式,写的文件不存在不会报错,会新建一个同样文件名的文件
-
操作文件(读、写)(
文件对象.read()
,文件对象.readline()
,文件对象.readlines()
)-
读
# 假设运行同目录有个txt文件叫 text.txt,里面内容为: ''' 1 2 3 ''' # 文件对象.read() - 从读写位置开始读到文件结束 f = open('test.txt', 'r', encoding='utf-8') result = f.read() print(result) ''' 1 2 3 ''' # 文件对象.readlines() - 从读写位置开始读到文件结束,返回的是列表,列表中的元素是每一行内容(只能针对文本文件有效) f = open('test.txt', 'r', encoding='utf-8') result = f.readlines() print(result) # ['1/n', '2/n', '3'] # 文件对象.readline() - 从读写位置开始读到一行结束(只能针对文本文件有效) f = open('test.txt', 'r', encoding='utf-8') result = f.readline() print(result) # 1 result = f.readline() print(result) # 2 result = f.readline() print(result) # 3
-
写
# 假设运行同目录有个txt文件叫 text.txt,里面内容为: ''' 1 2 3 ''' #文件对象.write(内容) f = open('test.txt', 'w', encoding='utf-8') f.write('abc') f = open('test.txt', 'r', encoding='utf-8') print(f) # abc
-
-
关闭文件(
文件对象.close()
)f = open('test.txt') print(f.read()) f.close() print(f.read()) # 关闭的文件,再阅读就会报错 # ValueError: I/O operation on closed file.
-
自动关闭打开的文件(
with open() as 变量:
)""" with open(file, mode='r',*, encoding=None) as 文件对象: 操作文件 """ with open('test.txt') as f: print(f.read()) # print(f.read()) # 再次阅读,就会报错,相当于自动关闭了打开的文件 # ValueError: I/O operation on closed file.
-
-
-
数据化持久的步骤
-
数据持久化的方法
""" 第一步:确定需要持久化的数据是什么 第二步:创建文件保持需要持久化的数据的初始值 第三步:在程序中需要这个数据的时候从文件中读出来 第四步:如果在程序中修改了这个数据,要将最新的数据更新到文件中 """
-
案例
# 开始前已经在同目录下 创建了 count.txt文件,里面内容为'0' # 案例1:打印程序的运行次数 def print_count(): with open('count.txt', encoding='utf-8') as f: count = int(f.read()) count += 1 print(count) with open('count.txt', 'w', encoding='utf-8') as f: f.write(str(count)) print_count() # 开始前已经在同目录下 创建了 name.txt文件,里面内容为'[]' # 案例2: 保存曾经添加的所有的名字 value = input('请输入数据:') with open('name.txt', encoding='utf-8') as f: result = f.read() names = eval(result) # 把'[]'转换成列表 names.append(value) print(names) with open('name.txt', 'w', encoding='utf-8') as f: f.write(str(names))
-