day16

1. 异常处理

1.1 错误

  • 错误:

    • 语法错误

      代码-不符合Python基本语法,解释器无法运行代码

      def test:
          pass
      
    • 逻辑错误

      代码在逻辑上不完整、不严谨,存在漏洞

      通过数据测试完成复杂逻辑错误验证

      # 使用input接收外部输入,采用字符串处理方式对输入数据进行判断
      num = input('>>:')
      if isinstance(int(num), int):
          print('int')
      else:
          print('Error')
      

1.2 异常

  • 异常出现后,无法运行后续代码,会产生程序中断

  • Python中可以采用if条件判断处理异常。以及捕获异常的方式

    try:
        被执行的代码块
    except 异常的类型:
        执行异常处理的代码
    
    try:
        data = int(input(':>>'))
        print(data)
    except ValueError:
        print('Error')
    

    实例代码

    '''
    try...except编写程序
    string = 'try except'
    转换为迭代器对象,之后采用next方法访问内部元素若干次,将其封装在函数之内
    StopIteration:  迭代器没有更多的值
    '''
    
    def iterFunc(string):
        iterStr = iter(string)
        while True:
            try:
                print(next(iterStr))
            except StopIteration:
                print('迭代完成!')
                break
    
    if __name__ == '__main__':
        data = input(':>>')
        iterFunc(data)
    
  • 完整的异常处理语法

    try:
        code   # 期望执行的代码
    except <异常类型1>:
        code2
    except <异常类型2> as e:
        print(e)
        code3
    else:
    	code4    #在未发生异常时执行code4
    
    
  • 异常处理多路分支实例

    try:
        msg = input(':>>')
        data = int(msg) # ValueError
        # print(x) # NameError
        # data = [1,2]
        # data[10] # IndexError
        #
        # 1+'abc' # TypeError
    except ValueError as e:
        print(e, type(e))
    except NameError:
        print('NameError')
    else:
        print(data)
    
  • 万能异常

    Exception:可以捕获任意异常

    S1 = 'hello'
    try:
        data = int(s1)
    except Exception as e:
        print(e)
    else:
        print(data)
    
  • 完整的异常处理

    S1 = 'hello'
    try:
        data = int(S1)
    except IndexError as e:
        print(e)
    except ValueError as e:
        print(e)
    except NameError as e:
        print(e)
    else:
        print('try内代码没有发生异常,执行!')
    finally:
        print('无论异常与否,都会执行改代码!通常执行清理工作!')
    '''
    invalid literal for int() with base 10: 'hello'
    无论异常与否,都会执行改代码!通常执行清理工作!
    '''
    
  • raise主动触发异常

    语法:raise [Exception[, args...]]

    ​ Exception:为异常类型,参数可省略

    ​ args: 可传参数

    try:
        raise TypeError('类型错误')
    except Exception as e:
        print(e)
    
  • 自定义异常

    异常类由自己创建,实现灵活的异常处理方式

    # 1. 自定义异常处理类型:NewException, 设定传入的异常信息‘msg’, 功能为返回‘msg’即可
    # 2. 使用自定义异常,实现判断输入字符串长度是否大于3,成立,则主动抛出NewException, 
    #		同时采用异常捕获方式,当捕获到异常时,输出‘使用NewException捕获’
    #       如果没有捕获到异常,输出'没有异常产生'
    # 	    NewException继承Exception
    
    class NewException(Exception):
        def __init__(self,msg):
            self.msg = msg
        def __str__(self):
            return self.msg+'__str__方法实现'
    
    try:
        data = input(':>>')
        if len(data)>3:
            raise NewException('New Exception')
    except NewException as e:
        print(e)
    
  • assert断言

    • assert用于判断一个表达式是否为真,当表达式为假时,执行异常处理

    • assert 表达式

      等价于

      if not 表达式:

      ​ raise AssertionError

      assert True # 条件为True,不处理
      # assert False # 条件为False,处理
      assert 1==1
      assert 1==2
      print('hello world')
      '''
      Traceback (most recent call last):
        File "E:/PythonProject/上课/实训课/2002正式班/day16_异常处理与文件读写/Demo.py", line 104, in <module>
          assert 1==2
      AssertionError
      '''
      '''
      assert如果不成立后面代码不会执行
      '''
      import sys
      
      assert('linux' in sys.platform)
      # 该代码只能运行在Linux平台下
      
  • try…except与if…else

    • 前一种方式在异常处理方面可替代第二种方式
    • 第一种方式,可以把错误处理于正常执行的代码明确的划分出来,同时在处理复杂工作任务时容易实现
    • 啥时候用异常处理:
      • try…except 本身会增加代码的处理逻辑,与正常工作无关,尽量少用
  • 异常汇总

    • Error
      • AttributeError
        • 试图访问一个数据对象没有的属性,例如 foo.x 但是foo没有x属性
      • IOError
        • 输入/输出异常,基本上就是文件无法打开
      • ImportError
        • 无法导入模块或包,考虑路径、文件名问题
      • IndentationError
        • 语法错误(的子类),考虑代码对齐
      • IndexError
        • 下标引用越界,比如x只有仨元素,访问了x[5]
      • KeyError
        • 字典中不存在的键
      • KeyboardInterrupt
        • Ctrl + c: 触发了一个系统内核级别的中断(kill -9)
      • NameError
        • 访问一个没有申请姓名的标识符
      • SyntaxError
        • python代码非法,解释器无法解释语法错误的代码
      • TypeError
        • 传入对象类型与要求不匹配
      • UnboundLocalError
        • 视图访问一个未被设置局部变量,有同名全局变量访问导致的错误
      • ValueError
        • 传入一个调用者未期望的数值
      • BaseException
        • 所有异常的基类
      • SystemExit
        • 解释器请求退出
      • Exception
        • 常见异常的基类
      • StopIteration
        • 迭代器没有更多的值
      • GeneratorExit
        • 生成器发生异常并退出
      • StandardError
        • 所有的内建标准异常的基类
      • FloatPointError
        • 浮点数计算错误
      • OverflowError
        • 数值运算超出了最大的限制
      • ZeroDivisionError
        • 除零
      • AssertionError
        • 断言失败
      • EnvironmentError
        • 操作系统错误的基类
      • OSError
        • 操作系统错误
      • WindowsError
        • 系统调用失败
      • LookupError
        • 无效的查询的基类
      • MemoryError
        • 内存溢出,相对python不致命
      • RuntimeError
        • 运行时错误
      • UnicodeError
        • Unicode设置错误
      • UnicodeDecodeError
        • Unicode解码错误
      • UnicodeEncodeError
        • Unicode编码错误
      • UnicodeTranslateError
        • Unicode 转换时错误
    • Warning
      • DeprecationWarning
        • 被弃用的特征的警告
      • FutureWarning
        • 关于构造将来语义会导致的警告
      • OverflowWarning
        • 旧语法-python2中数据类型long–长整形
      • UserWarning
        • 用户代码生成的警告
      • SytaxWarning
        • 可疑的语法警告

2. 文件操作

2.1 文件操作

文件操作

  • 利用函数open(),实现对一个文件进行读写,函数会返回一个句柄

  • 针对句柄可以完成各种操作

    • file = open('路径+文件名', mode=‘文件打开方式’, encoding='文件编码格式')
    • 利用file句柄可以完成文件各种操作
    • mode=r,w,a/ r+ w+ a+/ rb wb ab/ rb+ wb+ ab+
  • 操作文件的方式

    '''
    方法一:
    '''
    # 打开文件并获取句柄
    file = open('Demo.py', mode='r', encoding='utf-8')
    # 通过句柄读取文件
    print(file.read(100))
    # 关闭打开的句柄
    file.close()
    
    '''
    方法二:
    '''
    # 打开文件并获取句柄, with... as file语法自动关闭句柄
    with open('Demo.py', mode='r', encoding='utf-8') as file:
        # 通过句柄读取文件
        print(file.read(100))
    
    • 任务: 在系统终端调用系统关键字,并重定向到本地文件夹,命名问keyword.txt, 并读取数据

      terminal下 python -c “import this”

2.2 读文件

  • read(): 将文件中全部内容进行读取。特点-耗内存

  • read(n): 读取n个字符,

    • 注意:每次重复读取时,从当前位置继续向下读
    • 如果mode=‘rb’ ,读取的内容单位为字节(中文:utf-8 一个中文三个字节,gbk一个中文两个字节)
  • readline(): 一次读一行,每次读取出来的数据都带换行符’\n’, 字符串处理strip()

  • readlines(): 将每一行形成一个元素,放到列表中,将内容读取出来。特点-耗内存

    file = open('./Demo.py',mode='rb')
    content = file.read(120)
    print(content.decode('utf-8'))
    file.close()
    

2.3 写文件

  • 文件不存在-创建并写入

  • 文件存在,覆盖原始内容

file = open('./zen.txt',mode='w', encoding='utf-8')
file.write('test')
file.close()
  • 思考题

  • 考虑使用二进制读写方式将数据以 mode=‘wb’方式 写入数据’涪陵榨菜’

file = open('./test.txt',mode='wb')
file.write('涪陵榨菜'.encode('utf-8'))
file.close()

2.4 追加

a,ab 追加写入普通字符串和二进制字节码

  • 追加写入九九乘法表到test.txt中

    file = open('./test.txt',mode='a')
    for row in range(1,10):
        for column in range(1,row+1):
            file.write('%2d * %2d = %2d\t'%(row, column, row*column))
        file.write('\n')
    file.close()
    

2.5 读写

mode = ‘rb+’, ‘r+’

file = open('test.txt', mode='r+', encoding='utf-8')
content = file.read()
file.write('~~~~~~~~~~~new data!')
print(content)
file.flush()
file.close()

2.6 写读

mode = ‘w+’ ,‘wb+’

file = open('test.txt', mode = 'w+', encoding='utf-8')
file.write('$$$$$$$$$$$$$$$$$$$$ new data2!')
content = file.read()
print(content)
file.flush()
file.close()

2.7 追加读

mode = ‘a+’,‘ab+’

2.8 seek\tell

  • seek(n) 移动光标n个位置,移动单位为字节码bytes,utf-8中文需要移动3个bytes

    • 通常用seek()都是移动到开头或结尾位置
      • 开头:seek(0)
      • 结尾:seek(0,2)
    • seek函数第二个参数:
      • 0-开头
      • 1-当前位置
      • 2-文件结尾
  • tell():可实现获取当前光标位置,带返回值,返回单位也是bytes

    file = open('test.txt', mode='r+', encoding='utf-8')
    # 文件开头
    file.seek(0)
    content = file.read()
    print('content1:',content)
    file.seek(0)
    # 文件结尾
    file.seek(0,2)
    content2 = file.read()
    print('content2:',content2)
    file.seek(0)
    file.write('新内容')
    print(file.tell())
    file.close()
    

3. 练习题

'''
1. 创建文件data.txt,文件共100000行,每行存放一个1~100之间的整数
2. 在当前目录新建目录img, 里面包含100个文件, 100个文件名各不相同(X4G5.png), 将当前img目录所有以.png结尾的后缀名改为.jpg
3. 读取文件并计算平均分
4. 京东笔试题
1) 生成一个大文件ips.txt,要求1200行,每行随机为172.25.254.0/24段的ip;
2)读取ips.txt文件统计这个文件中ip出现频率排前10的ip;
5. 每注投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1‐‐33中选择;蓝色球号码从1‐‐16中选择
'''

ad()

print(‘content2:’,content2)
file.seek(0)
file.write(‘新内容’)
print(file.tell())
file.close()

3. 练习题

'''
1. 创建文件data.txt,文件共100000行,每行存放一个1~100之间的整数
2. 在当前目录新建目录img, 里面包含100个文件, 100个文件名各不相同(X4G5.png), 将当前img目录所有以.png结尾的后缀名改为.jpg
3. 读取文件并计算平均分
4. 京东笔试题
1) 生成一个大文件ips.txt,要求1200行,每行随机为172.25.254.0/24段的ip;
2)读取ips.txt文件统计这个文件中ip出现频率排前10的ip;
5. 每注投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1‐‐33中选择;蓝色球号码从1‐‐16中选择
'''
1. 创建文件data.txt,文件共100000行,每行存放一个1100之间的整数
import random   #导入随机变量模块
filename = r".\data.txt" #首先创建一个文件名字为data.txt
with open(filename , "w") as file:  #用with as 方法打开这个文件
    for i in range(100000):     #做一个循环
       file.write(str(random.randint(1,100)) + "\n")   #将随机生成的数,换行输入到文件中

2. 在当前目录新建目录img,里面包含100个文件,100个文件名各不相同(X4G5.png),将当前img目录所有
以.png结尾的后缀名改为.jpg
import random
import string
import os
# 生成一个文件名
def gen_code():
    #随机生成4位验证码
    li = random.sample(string.ascii_letters+string.digits,4)
    return ''.join(li)

def create_files():
    #使用列表生成式随机生成100个验证码
    li = [gen_code() for i in range(100)]
    #创建文件夹
    os.mkdir('img')
    #生成100个文件
    for i in li:
            with open("img/" + i + ".png", "a+") as fp:
                pass
create_files()


def modify_suffix(dirname, old_suffix, new_suffix):
   
    # :param dirname: 要操作的目录或文件夹
    # :param old_suffix: 旧的后缀名
    # :param new_suffix: 新的后缀名
   
    #找出以png结尾的文件名
    png_file = filter(lambda filename: filename.endswith(old_suffix), os.listdir(dirname))
    # 分离文件名和后缀
    base_files = [file.split(".")[0] for file in png_file]
    print(base_files[0])
    # 文件重命名
    for filename in base_files:
        old_name = os.path.join(dirname, filename + old_suffix)
        new_name = os.path.join(dirname, filename + new_suffix)
        os.rename(old_name, new_name)

modify_suffix("img", ".png", ".jpg")

3. 读取文件并计算平均分
import random   #导入随机变量模块
filename = r".\data.txt" #首先创建一个文件名字为data.txt
with open(filename , "w") as file:  #用with as 方法打开这个文件
    for i in range(100000):     #做一个循环
       file.write(str(random.randint(1,100)) + "\n")   #将随机生成的数,换行输入到文件中
filename = r".\data.txt"
with open(filename , "r",) as f:
    data=f.read()
sum=0
count=0
for i in data:
    if i=="\n":
        count+=1
        continue
    i = int(i)#根据ASCII表进行转换(0-9之间的数)
    sum+=i
print("平均分为:",sum/count)
4. 京东笔试题
1) 生成一个大文件ips.txt,要求1200行,每行随机为172.25.254.0/24段的ip;
2)读取ips.txt文件统计这个文件中ip出现频率排前10的ip;
import random
with open('ips.txt','w+') as f:
    for i in range(1200):
        f.write('172.25.254.'+str(random.randint(1,255))+'\n')
    f.seek(0,0)
    s = {}
    for i in f.readlines():
        if i in s:
            s[i] += 1
        else:
            s[i] = 1
    li = list(s.items())
    sort_li = sorted(li,reverse=True,key=lambda x:x[1])[:10]
    for i in sort_li:
        print(i[0],end='')

5."双色球"每注投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从133中选择;蓝色球号码从116中选择。随机生成一个投注号码。
"
import random
res=[]
for i in range(6):
    res.append(random.randint(1,33))
res.append(random.randint(1,16))

print(res)
'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值