内容简介
文件操作
异常处理
open()函数
用来创建一个文件对象并使用这个对象的read()和write()方法读写数据
file_object = open(file_path, mode)
文件操作的基础模式有三种:
文件读写内容的格式有两种:
打开文件得到的文件对象包含了读写数据和关闭文件的方法
# @function:演示文本文件的基本操作
# @Description:一直萤火虫
import os
# file_path = "C:\\Windows\\System32\\drivers\\etc\\hosts" # python中"\\",双斜线表示打印斜线
# file_path = "c:/windows/system32/drivers/etc/hosts" # 手动输入路径
file_path = r"C:\Windows\System32\drivers\etc\hosts" # 添加r,表明后面的字符信息为路径
# 让文件路径中的分隔符兼容操作不同的系统
file_path = file_path.replace("/", os.sep)
print(file_path)
# try:
# file = open(file_path, "r")
# print(file.read()) # 文件比较小的时候,可以直接读取整个文件的内容
# finally: # 不管try的中途有无错误,都会执行最后的finally语句块
# file.close() # 打开的文件对象必须关闭!!!
with open(file_path, "r") as file:
# 用with打开的文件对象,不需要手动调用close方法,会自动调用
print(file.read())
# 读取中文文件名的文件,并且判断文件是都存在
file_path = "1文本的输入和输出.py"
if not os.path.exists(file_path):
print("文件路径不存在,请检查!")
else:
with open(file_path, "r", encoding="utf-8") as file:
# print(file.read(50)) # 只读取50个字符,建议在文件内容庞大时使用
# print(file.readlines()) # 以列表的方式返回读取到的每一行内容
for line in file: # 等价于 for line in file.readlines()
print(line.rstrip())
print("*" * 100)
line = file.readline() # 读取文件中的一行
print(line)
程序运行中出现的错误称为异常
在程序运行的过程中,如果检测出一个不可能执行的操作,就会出现运行时错误
运行时错误(RuntimeError)会作为异常(对象抛出)
异常处理
函数抛出异常,调用者可以捕获以及处理该异常
恢复正常的程序
进行日志处理
以某些方式提醒用户(错误提示、对话框等)
异常处理最要的优势是将错误检测和处理分割开来
异常处理机制的主要组成:
try:
# 监控有可能产生异常的语句块
except XXXError1 as 异常对象名:
# 当一个异常出现时,会被顺序检查是否匹配except 后的异常类型
except XXXError2 as 异常对象名:
# 如果监测的异常匹配XXXError2,就会执行相关异常处理代码
except:
# 如果异常不匹配上面指定的异常类型,就会执行默认的异常处理代码
else:
#如果try块没有异常抛出就会执行else块
finally:
# 不管有无异常,一定会执行的语句块(一般用来释放资源等)
详细的的异常信息可以查看以下文档
https://docs.python.org/zh-tw/3.8/library/exceptions.html
示例
# @function:异常处理
# @Description:一只萤火虫
import traceback
import sys
# traceback.print_exc(file=open("文件名", "w+")) # 在控制台输出异常信息
# traceback.format_exc() # 以字符串形式返回异常栈信息
# traceback.print_exception() # 与print_exc等价
try:
num1, num2 = eval(input("请输入两个数字:"))
result = num1 / num2
print(result)
except SyntaxError as ex:
print("请检查输入的两个数字之间的分隔符是否是逗号:", ex)
except ZeroDivisionError as ex:
exc_type, exc_value, exc_traceback = sys.exc_info()
print("异常的类型:", exc_type)
print("异常的信息:", exc_value)
print("包含出错的函数、位置等信息的traceback对象:", exc_traceback)
curr_traceback = traceback.extract_tb(exc_traceback) # 提取traceback对象中的值,是一个元组
for file_ame, line_num, func_name, source in curr_traceback:
print("第{}行, {} -> {} 所在源文件:{}".format(line_num, func_name, source, file_ame))
except Exception as ex: # 不能确定具体的异常类型时,可以使用Exception
# 处理异常的代码
print("异常的信息:", ex)
else:
print("恭喜输入正确!")
finally:
print("任务完成了!")
import logging
import os
os.remove("log.log")
logging.basicConfig(
# 设置打印日志级别:CRITICAL(严重的) > ERROR > WARNING > INFO > DEBUG
level=logging.DEBUG,
filename="log.log",
filemode="w",
format="%(asctime)s - %(name)s - %(filename)s [line:%(lineno)d] - %(levelname)s - %(message)s"
)
logging.debug("调试信息")
logging.info("普通日志信息")
logging.warning("警告信息")
logging.error("错误信息")
logging.critical("致命错误")
try:
result = 10 / 0
except ZeroDivisionError as ex:
# logging.error("除数为零异常", exc_info=True) # 设置exc_info=True,会进行回溯
# logging.log(level=logging.DEBUG, msg="除数为零异常", exc_info=True)
logging.error(ex)
else:
print("恭喜,输入正确!")
finally:
print("结束")