一、异常处理机制
异常的定义:程序运行时发生的不正常事件。
使用异常处理机制,捕获异常,处理异常。
异常分为:内置异常、自定义异常。
1.1 内置异常处理
异常处理是对异常进行捕获、抛出、处理,提高程序健壮性的机制。
算法的设计要求:正确性、可读性、健壮性、高效率、低存储
使用关键字try except finally else组合成不同的处理方式,其中try和except是核心。
简单模式:
try:
代码1
except:
代码2
例子:
try:
print(name)
except:
print("命名错误")
捕获多个异常结构
try:
代码块
except XXX:
代码2
except XXX:
代码3
except XXX:
代码4
例子:
try:
print('hello' + 1234)
except NameError:
print("命名错误")
except TypeError:
print("类型错误")
except IndentationError:
print("缩进错误")
try:
print('hello' + 1234)
except (NameError, TypeError, IndentationError):
print("有错误")
try:
print('hello' + 1234)
except Exception as e:
print(f"有{e}错误")
try...except...else结构
语法:
try:
代码1
except:
代码2
else:
代码3
例子:
try:
a = 3
b = 0
c = a/b
except Exception as e:
print(f"{e}错误")
else:
print(c)
try...except...else...finally结构
语法:
try:
代码1
except:
代码2
else:
代码3
finally:
代码4
例子:
try:
a = 3
b = 1
c = a/b
except Exception as e:
print(f"{e}错误")
else:
print(c)
finally:
print("不用管我,异常还不是不异常,我都会输出")
练习:
1、使用异常处理,定义一个函数func(listinfo)listinfo为列表,
listinfo = [133, 88, 24, 33, 232, 44, 11, 44], 返回列表中小于100且为偶数的数。
def func(listinfo):
try:
ret=filter(lambda x:x<100 and x%2==0,listinfo)
except Exception as e:
print(e)
else:
print(list(ret))
listinfo=[133,88,24,33,123,44,11,44]
func(listinfo)
1.2 自定义异常
自定义异常——可以根据自己的实际需求做异常判断。
raise 手动抛出异常——内置异常、自定义异常都可以。
1.自定义异常必须继承 Exception 类
语法格式:
class MyException(BaseException):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return self.msg
try:
raise MyException('异常消息字符串')
except MyException as e:
print(e)
1.3 demo2:日志的简单应用
在python中,记录日志使用logging库,日志的级别从高到低分别为:
- CRITICAL:系统崩溃级别的错误,必须立即处理
- ERROR:运行时的错误,可能导致程序无法正常运行
- WARNING:警告信息
- INFO:信息性消息,程序正常运行
- DEBUG:详细信息,通常在诊断问题时有用
import logging
# 设置日志的打印级别
# logging.basicConfig(level=logging.DEBUG)
logging.critical('这是一个critical信息')
logging.error('这是一个error信息')
logging.warning('这是一个warning信息')
logging.info('这是一个info信息')
logging.debug('这是一个debug信息')
# 向指定的日志文件里去打印日志信息
import logging
# logging.basicConfig(filename='./app.log')
# logging.warning('这是一个warning信息')
# logging.basicConfig(filename='./app.log', level=logging.DEBUG, filemode='a',
# format='%(name)s - %(levelname)s - %(message)s')
# logging.warning('这是一个warning信息')
# %(name)s 日志记录器的名字
# %(levelname)s 日志级别
# %(asctime)s 时间
# %(message)s 消息本身
二、文件操作
2.0 文件操作的重要性和应用场景
2.1 文件的基本概念
2.1.1 文件的概念
文件是一个存储在某种持久性存储介质【硬盘、光盘、磁盘等】上的数据的结合。
文件可包含各种类型的信息:文本、图像、音频、视频、应用程序代码、其他类型的二进制数据。
文件通常由数据、元数据、文件系统等几部分组成。
文件的属性有:文件名、位置、文件类型、文件大小、创建日期、修改日期、访问权限。
2.1.2 文件的分类
s = "hello world!"
print("文本文件:", s)
print("二进制文件:", s.encode())
2.1.2 文件位置【路径】
路径分绝对路径和相对路径。
windows系统下:
这里的点有特殊含义,一个点表示当前路径下,两个点表示上一级路径下。
path = "C:\\Users\\admin\\Desktop\\py_gj\\py_day3"
print(path)
path1 = './day3.3.py'
print(path1)
path2 = "../py_day2/day2.2.py"
print(path2)
2.2 文件的操作
2.1.1 打开文件
mode常用的模式:
打开方式 | 功能 | 文件存在时 | 文件不存在时 |
r | 只读方式打开文件 | 打开 | 报错 |
r+ | 以读写方式打开文件 | 打开 | 报错 |
w | 只写方式打开文件 | 打开(清空之前内容) | 新建 |
w+ | 以读写方式打开文件 | 打开(清空之前内容) | 新建 |
a | 以追加方式打开文件(写) | 打开,保留之前内容 | 新建 |
a+ | 以读写方式打开文件 | 打开,保留之前内容 | 新建 |
mode参数 可以指定以什么样的编码方式读写文本,默认情况下open是以文本形式打开文件的,比如上面的四种mode模式。
当我们需要以"字节[二进制]"形式读写文件时,只需要在mode参数的后面加 b 就可以了。
- rb 以二进制形式打开一个文件,只读
- wb 以二进制形式打开一个文件,只写
- wb+ 以二进制形式打开一个文件,读写
demo1:读取文件
- 通过代码去读取 111.txt 文本文件的内容 “人生苦短,我用python”
# 1、打开文件
f = open("./111.txt", encoding='utf-8')
# 2、读取内容
read_data = f.read()
# 3、输出读取到内容
print(read_data)
# 4、关闭
f.close()
2.2.2 关闭文件 / read()方法
2.2.3 readline() readlines()
2.2.4 write()方法
read方法
readline readlines
with open("./111.txt",'r',encoding="utf-8") as f:
x=f.readline()
#x=f.readlines()
print(x)
write方法(在111.txt中写入“hahahah”)
a='\nhahahah'
with open("./111.txt",mode='a',encoding="utf-8") as f:
f.write(a)
# (一)将一个字符串写入二进制文件中 binary.txt。
# 要求:
# 1、这将创建一个名为 binary.txt 的二进制文件
# 2、并将字符串 Hello, world! 写入其中。
方法一:
with open("./binary.txt",mode='wb') as f:
f.write(b"Hello, world!")
方法二:
s="Hello, world!"
with open("./binary.txt", mode='wb') as f:
f.write(s.encode())
with open("./binary.txt",mode='rb') as f:
x=f.read()
print(x)
练习
# (三)将 1-100 之间能被 5 整除的数保存在列表 numbers 中
# 1. 将 numbers 中的元素写入到文件 num.txt 中
# 2. 使用文件操作方式打开 num.txt 文件读取内容,并计算它们的平均数
numbers=[x for x in range(1,101) if x%5==0]
with open("./numbers.txt",mode='w+',encoding='utf-8') as f:
f.write(str(numbers))
with open("./numbers.txt", mode='r') as f:
a=f.read()
print(a)
from functools import reduce
s=reduce(lambda x,y:x+y,numbers)
print(s/len(numbers))
#结果为
[5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100]
52.5
2.2.3 文件指针定位
python中文件读写,定位文件读写的指针会随着不断地读写而移动。所以我们想要正确的读写,就需要控制指针的定位。
f.tell() 功能:返回文件的当前位置,即文件指针当前位置 f.seek(offset[, whence]) 功能:将文件内部光标定位到指定的位置 参数:offset:开始的偏移量,也就是代表需要移动偏移的字节数 whence:可选,默认值为 0, 0代表从文件开头开始算起 1代表从当前位置开始算起 2代表从文件末尾算起 eg: f.seek(p,0) 移动到文件第p个字节处,绝对位置 f.seek(p,1) 移动到相对于当前位置之后的p个字节 f.seek(p,2) 移动到相对文章尾之后的p个字节 f.seek(0,0) 移动到文件开头
s = "Hello, world!"
with open('./binary.txt', mode='wb+') as f:
f.write(s.encode())
# f.seek(2,0) # 从开头 偏移2个
# f.seek(2,1) # 从当前 偏移2个
# f.seek(2,2) # 从末尾 偏移2个
# f.seek(0,0)
data = f.read(1)
print(data)
2.3 目录的操作
s.mkdir() 是Python标准库中的os模块提供的一个函数,用于创建一个新的目录。 这个函数接受一个参数,即要创建的目录的路径名(可以是相对路径也可以是绝对路径)。 如果创建成功,该函数不会返回任何值; 如果遇到错误,比如路径已存在或者没有足够的权限,它会抛出一个异常。 os.mkdir() 只能创建一级目录,如果需要创建多级嵌套的目录,应该使用 os.makedirs() 函数。
import os
try:
os.mkdir('./t1')
except Exception as e:
print(e)
try:
os.rmdir('./t1')
except Exception as e:
print(e)
try:
os.makedirs('./t1/t2')
except Exception as e:
print(e)
标签:文件,logging,进阶,python,except,try,print,txt
From: https://blog.csdn.net/weixin_56261190/article/details/143777900