zoukankan      html  css  js  c++  java
  • 大数据技术之_23_Python核心基础学习_04_ 异常 + 文件(3.5小时)

    第七章 异常7.1 异常的简介和异常的处理7.2 异常的传播7.3 异常对象7.4 自定义异常对象第八章 文件8.1 文件--打开8.2 文件--关闭8.3 文件--简单读取8.4 文件--读取大文件8.5 文件--readline8.6 文件--写入8.7 文件--二进制文件8.8 文件--seek() 和 tell()8.9 文件--其他操作


    第七章 异常

    7.1 异常的简介和异常的处理

    异常
        程序在运行过程当中,不可避免的会出现一些错误,比如:
            使用了没有赋值过的变量
            使用了不存在的索引
            除0
            ...
        这些错误在程序中,我们称其为异常。
        程序运行过程中,一旦出现异常将会导致程序立即终止,异常以后的代码全部都不会执行!!!

    -------------------------------------------------------------------------------------

    处理异常
        程序运行时出现异常,目的并不是让我们的程序直接终止!
        Python 是希望在出现异常时,我们可以编写代码来对异常进行处理!

        try 语句
            try:
                代码块(可能出现错误的语句)
            except 异常类型 as 异常名:
                代码块(出现错误以后的处理方式)
            except 异常类型 as 异常名:
                代码块(出现错误以后的处理方式)
            except 异常类型 as 异常名:
                代码块(出现错误以后的处理方式)
            else:
                代码块(没出错时要执行的语句)    
            finally:
                代码块(该代码块总会执行)    

            try 是必须的,else 语句有没有都行
            except 和 finally 至少有一个    

        可以将可能出错的代码放入到 try 语句,
            如果代码没有错误,则会正常执行,
            如果出现错误,则会执行 expect 子句中的代码,
        这样我们就可以通过代码来处理异常,避免因为一个异常而导致整个程序的运行终止  

    异常--示例代码:

    # print('hello')
    # try:
    #     # try 中放置的是有可能出现错误的代码
    #     print(10/0)
    # except:
    #     # except 中放置的是出错以后的处理方式
    #     print('哈哈哈,出错了~~~')
    # else:
    #     print('程序正常执行没有错误')    
    # print('你好')

    7.2 异常的传播

    异常的传播
        当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会再继续传播,
            如果函数中没有对异常进行处理,则异常会继续向函数调用处传播,
            如果函数调用处处理了异常,则不再传播,如果没有处理则继续向调用处传播,
            直到传递到全局作用域(主模块),如果依然没有处理,则程序终止,并且显示异常信息。

        当程序运行过程中出现异常以后,所有的异常信息会被保存一个专门的异常对象中:
            而异常传播时,实际上就是将异常对象抛给了调用处
            比如 : ZeroDivisionError 类,该类的对象专门用来表示除0的异常
                    NameError 类,该类的对象专门用来处理变量错误的异常
                    ......

        在 Python 为我们提供了多个异常对象!

    示例代码:

    # print(10/0)   # 异常出现在全局

    def fn1():
        print('hello fn1')
        print(10/0# 异常出现在函数,不调用该函数,则异常不会出现

    def fn2():
        print('hello fn2')
        fn1()

    def fn3():
        print('hello fn3')
        fn2()

    fn3()

    输出结果如下:

    hello fn3
    hello fn2
    hello fn1
    Traceback (most recent call last):
      File "demo.py", line 15in <module>
        fn3()
      File "demo.py", line 13in fn3
        fn2()
      File "demo.py", line 9in fn2
        fn1()
      File "demo.py", line 5in fn1
        print(10/0# 异常出现在函数,不调用该函数,则异常不会出现
    ZeroDivisionError: division by zero

    7.3 异常对象

    print('异常出现前~~~')
    l = []
    try:
        # print(c)
        # l[10]
        # 1 + 'hello'
        print(10/0)
    except NameError:
        # 如果 except 后不跟任何的内容,则此时它会捕获到所有的异常
        # 如果在 except 后跟着一个异常的类型,那么此时它只会捕获该类型的异常
        print('出现 NameError 异常')
    except ZeroDivisionError:
        print('出现 ZeroDivisionError 异常')
    except IndexError:
        print('出现 IndexError 异常')
    except Exception as e :
        # Exception 是所有异常类的父类,所以如果 except 后跟的是 Exception,它也会捕获到所有的异常
        # 可以在异常类后边跟着一个 as xx , 此时 xx 就是异常对象
        print('未知异常', e, type(e))
    finally :
        print('无论是否出现异常,该子句都会执行')

    print('异常出现后~~~')

    7.4 自定义异常对象

    抛出异常
        - 可以使用 raise 语句来抛出异常,
            raise语句后需要跟一个异常类 或 异常的实例。

    # 也可以自定义异常类,只需要创建一个类继承 Exception 即可
    class MyError(Exception):
        pass

    def add(a, b):
        # 如果 a 和 b 中有负数,就向调用处抛出异常
        if a < 0 or b < 0:
            # raise 用于向外部抛出异常,后边可以跟一个异常类,或异常类的实例
            # raise Exception   # 抛出异常类
            # raise Exception('两个参数中不能有负数!')     # 抛出异常类的实例
            # 抛出异常的目的:告诉调用者这里调用时出现问题,希望你自己处理一下
            raise MyError('自定义的异常')

            # 也可以通过 if else 来代替异常的处理
            # return None
        r = a + b
        return r

    print(add(-123456))    

    第八章 文件

    - 通过 Python 程序来对计算机中的各种文件进行增删改查的操作
    - I/O(Input/Output)
    - 操作文件的步骤:
        ① 打开文件
        ② 对文件进行各种操作(读、写),然后保存
        ③ 关闭文件

    8.1 文件--打开

    # open(file, mode='r', buffering=-1, encoding_=None, errors=None, newline=None, closefd=True, opener=None)
    #   使用 open 函数来打开一个文件
    # 参数:
    #   file 表示要打开的文件的名字(即路径)
    # 返回值:
    #   返回一个对象,这个对象就代表了当前打开的文件

    # 创建一个变量,来保存文件的名字
    # 如果目标文件和当前文件在同一级目录下,则直接使用文件名即可
    file_name = 'demo.txt'

    # 在 windows 系统使用路径时,可以使用 / 来代替  ,或者可以使用 \ 来代替 
    # 或者也可以使用原始字符串,但需要在字符串前面加一个 r
    file_name = 'hello\demo.txt'
    file_name = r'hellodemo.txt'

    # 表示路径,可以使用 .. 来返回一级目录
    file_name = '../hello/demo.txt'

    # 如果目标文件距离当前文件比较远,此时可以使用绝对路径
    # 绝对路径应该从磁盘的根目录开始书写
    file_name = r'C:UsersruceDesktophello.txt'

    # file_obj = open(file_name)    # 打开 file_name 对应的文件

    # print(file_obj)

    8.2 文件--关闭

    # 打开文件
    file_name = 'demo.txt'

    # 调用 open() 来打开文件
    # file_obj = open(file_name)

    # 当我们获取了文件对象以后,所有的对文件的操作都应该通过对象来进行
    # read() 方法
    #   用来读取文件中的内容,它会将内容全部保存为一个字符串返回
    # content = file_obj.read()

    # print(content)

    # 调用 close() 方法来关闭文件
    # file_obj.close()

    # with ... as 语句
    # with open(file_name) as file_obj :
        # 在 with 语句中可以直接使用 file_obj 来做文件操作
        # 此时这个文件只能在 with 中使用,一旦 with 结束则文件会自动 close()
        print(file_obj.read())

    file_name = 'hello'

    try:
        with open(file_name) as file_obj :
            print(file_obj.read())
    except FileNotFoundError :
        print(f'{file_name} 文件不存在~~~')

    8.3 文件--简单读取

    file_name = 'demo2.txt'

    try:
        # 调用 open() 来打开一个文件,可以将文件分成两种类型:
        #   一种是纯文本文件(使用 utf-8 等编码编写的文本文件)
        #   一种是二进制文件(图片、mp3、ppt 等这些文件)
        # open() 打开文件时,默认是以文本文件的形式打开的,但是 open() 默认的编码为 None,为 ASCII 编码
        #   所以处理文本文件时,必须要指定文件的编码
        with open(file_name, encoding='utf-8'as file_obj :
            # 通过 read() 来读取文件中的内容
            # 如果直接调用 read() 它会将文本文件的所有内容全部都读取出来
            #   如果要读取的文件较大的话,会一次性将文件的内容加载到内存中,容易导致内存泄漏
            #   所以对于较大的文件,不要直接调用 read()
            # help(file_obj.read)
            # read() 可以接收一个 size 作为参数,该参数用来指定要读取的字符的数量
            #   默认值为 -1,它会读取文件中的所有字符
            #   可以为 size 指定一个值,这样 read() 会读取指定数量的字符,(单位是字符)
            #       每一次读取都是从上次读取到位置开始读取的
            #       如果字符的数量小于 size,则会读取剩余所有的
            #       如果已经读取到了文件的最后了,则会返回空串
            # content = file_obj.read(-1)
            content = file_obj.read(6)
            content = file_obj.read(6)
            content = file_obj.read(6)
            content = file_obj.read(6)
            # print(content)
            # print(len(content))
    except FileNotFoundError :
        print(f'{file_name} 这个文件不存在!')

    8.4 文件--读取大文件

    # 读取大文件的方式
    file_name = 'demo.txt'
    try:
        with open(file_name, encoding='utf-8'as file_obj :
            # 定义一个变量,来保存文件的内容
            file_content = ''
            # 定义一个变量,来指定每次读取的大小
            chunk = 100
            # 创建一个循环来读取文件内容
            while True :
                # 读取 chunk 大小的内容
                content = file_obj.read(chunk)

                # 检查是否读取到了内容
                if not content :
                    # 内容读取完毕,则退出循环
                    break

                # 输出内容
                # print(content, end='') 
                # 或者如下输出内容
                file_content += content

    except FileNotFoundError :
        print(f'{file_name} 这个文件不存在!')

    print(file_content)

    8.5 文件--readline

    import pprint
    import os
    file_name = 'demo.txt'

    with open(file_name, encoding='utf-8'as file_obj :
        # readline()
        #   该方法可以用来读取一行内容
        # print(file_obj.readline(), end='')
        # print(file_obj.readline())
        # print(file_obj.readline())

        # readlines()
        #   该方法用于一行一行的读取内容,它会一次性将读取到的内容封装到一个列表中返回
        # r = file_obj.readlines()
        # pprint.pprint(r[0])
        # pprint.pprint(r[1])
        # pprint.pprint(r[2])

        for t in file_obj :
            print(t)

    8.6 文件--写入

    file_name = 'demo5.txt'

    # 使用 open() 打开文件时必须要指定打开文件所要做的操作(读、写、追加):
    # 如果不指定操作类型,则默认是读取文件,而读取文件时是不能向文件中写入的
    #   r 表示只读的
    #   w 表示是可写的,使用 w 来写入文件时,如果文件不存在会创建文件,如果文件存在则会截断文件,截断文件指删除原来文件中的所有内容
    #   a 表示追加内容,如果文件不存在会创建文件,如果文件存在则会向文件中追加内容
    #   x 用来新建文件,如果文件不存在则创建,如果文件存在则报错
    #   + 为操作符增加功能
    #   r+ 即可读又可写,文件不存在会报错
    #   w+
    #   a+

    # with open(file_name, 'w', encoding='utf-8') as file_obj :
    # with open(file_name, 'r+', encoding='utf-8') as file_obj :
    with open(file_name, 'x', encoding='utf-8'as file_obj :
        # write() 来向文件中写入内容
        #   如果操作的是一个文本文件的话,则 write() 需要传递一个字符串作为参数
        #   该方法会可以分多次向文件中写入内容
        #   写入完成以后,该方法会返回写入的字符的个数
        file_obj.write('aaa ')
        file_obj.write('bbb ')
        file_obj.write('ccc ')
        r = file_obj.write(str(123) + '123123 ')
        r = file_obj.write('今天天气真不错')
        print(r)

    8.7 文件--二进制文件

    file_name = 'c:/Users/bruce/Desktop/告白气球.flac'

    # 读取模式:
    #   t 读取文本文件(默认值)
    #   b 读取二进制文件

    with open(file_name, 'rb'as file_obj :
        # 读取文本文件时,size 是以字符为单位的
        # 读取二进制文件时,size 是以字节为单位的
        # print(file_obj.read(100))

        # 将读取到的内容写出来
        # 定义一个新的文件
        new_name = 'aa.flac'
        with open(new_name, 'wb'as new_file_obj :
            # 定义每次读取的大小
            chunk = 1024 * 100
            while True :
                # 从已有的对象中读取数据
                content = file_obj.read(chunk)
                # 内容读取完毕,终止循环
                if not content :
                    break
                # 将读取到的数据写入到新对象中
                new_file_obj.write(content)

    8.8 文件--seek() 和 tell()

    # 读取二进制文件
    # with open('demo.txt','rb') as file_obj :
        print(file_obj.read(100))
        print(file_obj.read(30))

        # tell() 方法用来查看当前读取的位置
        print('当前读取到了 -->', file_obj.tell())

        # seek() 可以修改当前读取的位置
        file_obj.seek(55)       # 修改当前读取的位置为第 55 个字节
        file_obj.seek(800)    # 从头位置开始计算,读 80 个字节
        file_obj.seek(701)    # 从当前位置开始计算,读 70 个字节
        file_obj.seek(-102)   # 从最后位置开始计算,读 10 个字节
        print(file_obj.read())

    # seek() 需要两个参数
    #   第一个参数:是要切换到的位置
    #   第二个参数:计算位置方式
    #   可选值:
    #       0 从头位置开始计算,默认值
    #       1 从当前位置开始计算
    #       2 从最后位置开始计算

    -------------------------------------------------------------------------------------

    # 读取文本文件
    # with open('demo2.txt','rt', encoding='utf-8') as file_obj :
        print(file_obj.read(100))
        print(file_obj.read(30))

        # tell() 方法用来查看当前读取的位置
        print('当前读取到了 -->', file_obj.tell())

        # seek() 可以修改当前读取的位置
        file_obj.seek(9)       # 修改当前读取的位置为第 9 个字节,特别注意:在 UTF-8 编码中,1个中文 = 3个字节
        print(file_obj.read())

    8.9 文件--其他操作

    import os
    from pprint import pprint

    # os.listdir()  获取指定目录的目录结构
    #   需要一个路径作为参数,会获取到该路径下的目录结构,默认路径为 . 当前目录
    #   该方法会返回一个列表,目录中的每一个文件(夹)的名字都是列表中的一个元素
    r = os.listdir()
    pprint(r)

    # os.getcwd()   获取当前所在的目录
    r = os.getcwd()
    pprint(r)

    # os.chdir()    切换当前所在的目录,作用相当于 cd
    # os.chdir('c:/')

    # 创建目录
    # os.mkdir("aaa") 在当前目录下创建一个名字为 aaa 的目录

    # 删除目录
    # os.rmdir('abc')

    # 创建文件
    # open('aa.txt', 'w')

    # 删除文件
    # os.remove('aa.txt')

    # os.rename('旧文件名字', '新文件名字')  # 对一个文件进行重命名并移动(本质上都是移动)
    # os.rename('aa.txt', 'bb.txt') #  对一个文件进行重命名并移动(只是移动到当前的目录)
    os.rename('bb.txt''c:/users/bruce/Desktop/bb.txt'# 对一个文件进行重命名并移动(移动到指定的目录)
  • 相关阅读:
    mac c++编译出现segmentation fault :11错误
    ssh 连接缓慢解决方法
    237. Delete Node in a Linked List
    203. Remove Linked List Elements
    Inversion of Control Containers and the Dependency Injection pattern
    82. Remove Duplicates from Sorted List II
    83. Remove Duplicates from Sorted List
    SxsTrace
    使用CCleaner卸载chrome
    decimal and double ToString problem
  • 原文地址:https://www.cnblogs.com/chenmingjun/p/10865238.html
Copyright © 2011-2022 走看看