【大数据开发】Python基础——异常和文件

本文详细介绍了Python中的异常处理,包括初识异常、异常对象、抛出异常的用法。同时,深入讲解了文件操作,如打开、关闭文件,以及读写文件的各种方法,如read、readline、readlines、write等。此外,还讨论了文件定位和异常捕获。文章以实际代码示例展示,有助于理解掌握Python异常处理和文件操作的核心概念。
摘要由CSDN通过智能技术生成

六、异常和文件

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


# print(10/0)   # ZeroDivisionError: division by zero


def fn():
    print('Hello fn')
    print(10/0)

def fn2():
    print('Hello fn2')
    fn()

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

fn3()

6.2 异常对象 – Exception
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 异常')
# Exception 是所有异常类的父类,所以如果except后跟的是Exception,他也会捕获到所有的异常
# 可以在异常类后边跟着一个 as xx 此时xx就是异常对象
except Exception as e :
    print('未知异常',e,type(e))
finally :
    print('无论是否出现异常,该子句都会执行')

print('异常出现后')

6.3 抛出异常 – raise

类似于Java中的throws关键字

# 也可以自定义异常类,只需要创建一个类继承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(-123,456))    
6.4 打开文件 – open
# open(file, mode='r', buffering=-1, encoding_=None, errors=None, newline=None, closefd=True, opener=None)
# 使用open函数来打开一个文件
# 参数:
#   file 要打开的文件的名字(路径)
# 返回值:
#   返回一个对象,这个对象就代表了当前打开的文件

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

# 在windows系统使用路径时,可以使用/来代替 \
# 或者可以使用 \\ 来代替 \
# 或者也可以使用原始字符串
# file_name = 'hello\\demo.txt'
# file_name = r'hello\demo.txt'

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

# 如果目标文件距离当前文件比较远,此时可以使用绝对路径
# 绝对路径应该从磁盘的根目录开始书写
file_name = r'C:\学习资料\Python-代码-笔记\lesson_07_异常和文件\hello\demo.txt'

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

print(type(file_obj), file_obj)   # <class '_io.TextIOWrapper'> <_io.TextIOWrapper name='C:\\学习资料\\Python-代码-笔记\\lesson_07_异常和文件\\hello\\demo.txt' mode='r' encoding='cp936'>

6.5 关闭文件 – with … as语句、close
# 打开文件
file_name = 'demo.txt'

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

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

# print(type(content),content)
'''
<class 'str'> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
'''

# 关闭文件
# 调用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} 文件不存在~~')

6.6 文件的读取 – read
file_name = 'demo2.txt'

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

        help(file_obj.read)
        '''
        Help on built-in function read:

        read(size=-1, /) method of _io.TextIOWrapper instance
            Read at most n characters from stream.
    
            Read from underlying buffer until we have n characters or we hit EOF.
            If n is negative or omitted, read until EOF.
        '''

        content = file_obj.read(-1)   # 读取整个文件  # 长度为 23
        # 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} 这个文件不存在!')

# 读取大文件的方式
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)

6.7 文件读取 – readline、readlines
import pprint
import os
file_name = 'demo.txt'

with open(file_name , encoding='utf-8') as file_obj:
    # readline()
    # 该方法可以用来读取一行内容,直到读取到该行的换行符
    # print方法默认在输出时添加 '\n' 符号,def print(self, *args, sep=' ', end='\n', file=None)
    # print(file_obj.readline(),end='')
    # print(file_obj.readline())
    # print(file_obj.readline())
    # 上面的输出结果如下
    '''
    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
    tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,

    quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo

    '''

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

    # 使用pprint优雅地输出打印结果
    '''
    'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n'
    'tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\n'
    'quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\n'
    '''

    for t in r:
        print(t, end='')
    # 打印结果
    '''
    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
    tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
    quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
    consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
    cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
    proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    '''
    
6.8 文件的写入 – write
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\n')
    file_obj.write('bbb\n')
    file_obj.write('ccc\n')
    r = file_obj.write(str(123)+'123123\n')
    r = file_obj.write('今天天气真不错')
    print(r, type(r))

6.9 文件 –
file_name = 'C:\大数据开发.pdf'

# 读取模式
# t 读取文本文件(默认值)
# b 读取二进制文件
# open()函数第二个参数中带了b时,表示在原有模式的基础上,以二进制方式打开。
# 如果使用“a+”模式时,直接写入字符串跟数字都会出错,需要以二进制的形式写入

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

    tail = file_obj.readlines()

    print(file_obj.read(100))

    # 将读取到的内容写出来
    # 定义一个新的文件
    new_name = '大数据开发副本.pdf'

    with open(new_name, 'wb') as new_obj:

        # 定义每次读取的大小
        chunk = 1024 * 100

        while True:
            # 从已有的对象中读取数据
            content = file_obj.read(chunk)

            # 内容读取完毕,终止循环
            if not content:
                break

            # 将读取到的数据写入到新对象中
            new_obj.write(content)

6.10 读取文件的位置
with open('demo.txt','rb') as file_obj:
    print(file_obj.read(100))
    print(file_obj.read(30))

#    seek() 可以修改当前读取的位置
#    file_obj.seek(55)
#     file_obj.seek(80,0)
#     file_obj.seek(70,1)
#     file_obj.seek(-10,2)
#     seek()需要两个参数
#       第一个 是要切换到的位置
#       第二个 计算位置方式
#           可选值:
#               0 从头计算,默认值
#               1 从当前位置计算
#               2 从最后位置开始计算

#     print(file_obj.read())

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

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

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

    print(file_obj.read())

    # tell() 方法用来查看当前读取的位置
    print('当前读取到了 -->',file_obj.tell())
6.11 文件的其他操作
import os
from pprint import pprint

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

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

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

# r = os.getcwd()

# 创建目录
# 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/lilichao/desktop/bb.txt')

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

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

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

        try是必须的 else语句有没有都行
        exceptfinally至少有一个    

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

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

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

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

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

## 文件(File)
    - 通过Python程序来对计算机中的各种文件进行增删改查的操作
    - I/O(Input / Output)
    - 操作文件的步骤:
        ① 打开文件
        ② 对文件进行各种操作(读、写),然后保存
        ③ 关闭文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值