Python 文件操作

内容简介

文件操作

  • 掌握文件的输入及输出
  • 使用open()函数读写文件
  • 了解os.path的使用
  • 文件对象的常用方法

异常处理

  • Python中的内置异常
  • Python中的异常处理机制
  • 自定义异常

文件

  • 计算机中的文件:相关记录或放在一起的数据集合
    Python 文件操作_第1张图片

文本输入和输出

  • open()函数

    用来创建一个文件对象并使用这个对象的read()和write()方法读写数据

    file_object = open(file_path, mode)	
    
    • mode:文件的打开模式
      Python 文件操作_第2张图片
  • 文件操作的基础模式有三种:

    • r模式为read(默认操作)
    • w模式为write
    • a模式为append
  • 文件读写内容的格式有两种:

    • t模式为text
    • b模式为bytes
      需要注意的是:t、b这两种模式均不能单独使用,都需要与r/w/a之一连用

操作文本文件

  • 打开文件得到的文件对象包含了读写数据和关闭文件的方法

    _io.TextIOWrapper类的一个实例
    Python 文件操作_第3张图片

    # @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)会作为异常(对象抛出)

  • 异常处理

    • 函数抛出异常,调用者可以捕获以及处理该异常

      恢复正常的程序
      进行日志处理
      以某些方式提醒用户(错误提示、对话框等)

    • 异常处理最要的优势是将错误检测和处理分割开来

异常处理

  • Python异常处理机制
    Python 文件操作_第4张图片

  • 异常处理机制的主要组成:

    • try:监控有可能产生异常的语句块
    • except:检测出现的异常类型是否匹配
    • else:如果try块没有异常抛出就会执行else块
    • finally:不管有无异常,一定会执行的语句块(一般用来释放资源等)
    • raise:通常在函数中手动抛出异常
    try:
        # 监控有可能产生异常的语句块
    except XXXError1 as 异常对象名:
        # 当一个异常出现时,会被顺序检查是否匹配except 后的异常类型
    except XXXError2 as 异常对象名:
        # 如果监测的异常匹配XXXError2,就会执行相关异常处理代码
    except:
        # 如果异常不匹配上面指定的异常类型,就会执行默认的异常处理代码
    else:
        #如果try块没有异常抛出就会执行else块
    finally:
        # 不管有无异常,一定会执行的语句块(一般用来释放资源等)
    

异常的层次结构

  • 异常层次结构图(越往上越高)
    Python 文件操作_第5张图片

  • 详细的的异常信息可以查看以下文档
    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("任务完成了!")
    

创建自定义异常类

  • 可以通过继承RuntimeError类来定义一个自定义异常类
    • 尽量使用Python中提供的内置异常类儿不要创建自己的异常类
    • 如果遇到一个不能用预定义异常类恰当描述的问题,可以创建自定义异常类

日志

  • 日志配置参数
    Python 文件操作_第6张图片
  • 格式化变量
    Python 文件操作_第7张图片
  • 示例

@function:日志处理

@Description:一只萤火虫

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("结束")

你可能感兴趣的:(Python)