异常与文件操作 python复习笔记

Python异常

  • 作用

    用作信号通知,通知上层调用者有错误产生需要处理

1. try 语句

  • 语法
try:
    可能发生异常的语句块
except 错误类型1 [as 变量名1]:
    异常处理语句块1
except 错误类型2 [as 变量名2]:
    异常处理语句块2
...
except 错误类型n [as 变量名n]:
    异常处理语句块n
except:
    异常处理语句块other
else:
    未发生异常的语句
finally:
    最终的处理语句

  • 作用

    尝试捕获异常,得到异常通知,将程序由异常状态变为正常状态

  • 说明

    except 子句可以有 1个或多个

    except: 不给错误类型,可以匹配全部的错误类型

    else 子句里的语句会在 没有错误发生时执行,当处于异常时不执行

    finally 子句里的语句,无论何时都执行

  • 示例

try:
    x = int(input("请输入一个整数:"))
    print('x=', x)
except ValueError:
    print('您的输入不能转成整数')

print("程序结束")

2. raise 语句

  • 问题

    # 写一个函数, get_score 函数,读取用户输入的整数成绩, 
    # 成绩的正常值是0~100 之间, 要求, 如果不在0~100 之间
    # 报 ValueError类型的错误
    def get_score():
        x = int(input('请输入成绩:'))
        if 0 <= x <= 100:
            return x
        raise ValueError
        
    
  • 语法

    raise 异常类型
    或
    raise 异常对象
    
  • 作用

    • 抛出一个错误,让程序进入异常状态
    • 发送错误通知给调用者
  • 示例:

## 写一个函数, get_score 函数,读取用户输入的整数成绩,
## 成绩的正常值是0~100 之间, 要求, 如果不在0~100 之间
## 报 ValueError类型的错误
def get_score():
    x = int(input('请输入成绩:'))
    if 0 <= x <= 100:
        return x
    # raise ValueError
    raise ValueError('用户输入的成绩不在 0~100 之间')

try:
    score = get_score()
    print(score)
except ValueError as err:
    print("成绩输入有误 err=", err)

err的作用就是接收raise ValueError(‘用户输入的成绩不在 0~100 之间’)给出的提示信息

  • 异常类型的可选种类

    详见:

    >>> help(__builtins__)
    
  • 课后练习1

    写一个猜拳游戏: 石头,剪刀,布, 
    让电脑随机生成一个,
    你的输入如下:
        0)  石头
        1)  剪刀
        2)  布
        q)  退出
        请选择: 0
       电脑出的是 布 ,你输了
    循环输入,知道输入q 为止
    

    参考答案1

    import random
    import time
    
    signal = ['石头', '剪刀', '布']
    
    def show_menu():
        print(" 0)  石头 ")
        print(" 1)  剪刀 ")
        print(" 2)  布  ")
        print(" q)  退出 ")
    
    def begin_compare(computer, your):
        comp_s = signal[computer]  # 电脑的字符串
        your_s = signal[your]
        print('电脑出的是', comp_s, '你出的是', your_s)
        if comp_s == your_s:
            print('平局!')
        elif comp_s == '石头':
            if your_s == '剪刀':
                print('你输了!')
            elif your_s == '布':
                print('你赢了!')
        elif comp_s == '剪刀':
            if your_s == '布':
                print('你输了!')
            elif your_s == '石头':
                print('你赢了!')
        elif comp_s == '布':
            if your_s == '石头':
                print('你输了!')
            elif your_s == '剪刀':
                print('你赢了!')
        # time.sleep(5)
        input('请输入回车键,继续下一次猜拳:')
    
    def run():
        '''开始猜拳游戏'''
        while True:
            show_menu()
            s = input('请选择:')
            if s == 'q':
                break
            your = int(s)  # 你的选项
            computer = random.randint(0, 2)
            begin_compare(computer, your)
    
    
    if __name__ == '__main__':
        run()
    

    参考答案2

    import random
    import time
    
    signal = ['石头', '剪刀', '布']
    result = ['平局!', '你赢了!', '你输了!']
            #   0         1          -1
    
    # 定义一个二维列表, 行代表 电脑的选择, 列代表我的选择
    map = [
      # 用户: 0  1  2
        [ 0, -1,  1],  # 电脑出的是0---> 石头
        [ 1,  0, -1],  # 电脑出的是1---> 剪刀
        [-1,  1,  0],  # 电脑出的是2---> 布
    ]
    
    def show_menu():
        print(" 0)  石头 ")
        print(" 1)  剪刀 ")
        print(" 2)  布  ")
        print(" q)  退出 ")
    
    def begin_compare(computer, your):
        comp_s = signal[computer]  # 电脑的字符串
        your_s = signal[your]
        print('电脑出的是', comp_s, '你出的是', your_s)
        result_index = map[computer][your]
        r = result[result_index]
        print(r)
        # time.sleep(5)
        input('请输入回车键,继续下一次猜拳:')
    
    def run():
        '''开始猜拳游戏'''
        while True:
            show_menu()
            s = input('请选择:')
            if s == 'q':
                break
            your = int(s)  # 你的选项
            computer = random.randint(0, 2)
            begin_compare(computer, your)
    
    
    if __name__ == '__main__':
        run()
    
  • 课后练习2

    写一个猜数字游戏 让电脑随机生成一个 0 ~ 100 的整数让用来猜
    如果 您输入的数大于电脑生产的数,提示:“您猜大了”, 继续猜
    如果 您输入的数小于电脑生产的数,提示:“您猜小了”, 继续猜
    当 您输入的数等于电脑生产的数,提示:"恭喜您猜对了" 打印猜的次数后退出程序
    

    参考答案

    import random
    
    def run():
        # 1. 让电脑生成一个整数,用 x 变量绑定
        x = random.randint(0, 100)
        count = 0  # 记次数
        while True:
            y = int(input('请输入: '))
            count += 1
            if y > x:
                print('您猜大了!')
            elif y < x:
                print('您猜小了!')
            else:
                print('恭喜您猜对了!')
                break
        print('您共猜了', count, '次')
    
    if __name__ == '__main__':
        run()
    

3.Python全部的错误类型

错误类型 说明
ZeroDivisionError 除(或取模)零 (所有数据类型)
ValueError 传入无效的参数
AssertionError 断言语句失败
StopIteration 迭代器没有更多的值
IndexError 序列中没有此索引(index)
IndentationError 缩进错误
OSError 输入/输出操作失败
ImportError 导入模块/对象失败
NameError 未声明/初始化对象 (没有属性)
AttributeError 对象没有这个属性
GeneratorExit 生成器(generator)发生异常来通知退出
TypeError 对类型无效的操作
KeyboardInterrupt 用户中断执行(通常是输入^C)
OverflowError 数值运算超出最大限制
FloatingPointError 浮点计算错误
BaseException 所有异常的基类
SystemExit 解释器请求退出
Exception 常规错误的基类
StandardError 所有的内建标准异常的基类
ArithmeticError 所有数值计算错误的基类
EOFError 没有内建输入,到达EOF 标记
EnvironmentError 操作系统错误的基类
WindowsError 系统调用失败
LookupError 无效数据查询的基类
KeyError 映射中没有这个键
MemoryError 内存溢出错误(对于Python 解释器不是致命的)
UnboundLocalError 访问未初始化的本地变量
ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError 一般的运行时错误
NotImplementedError 尚未实现的方法
SyntaxError Python 语法错误
TabError Tab 和空格混用
SystemError 一般的解释器系统错误
UnicodeError Unicode 相关的错误
UnicodeDecodeError Unicode 解码时的错误
UnicodeEncodeError Unicode 编码时错误
UnicodeTranslateError Unicode 转换时错误
以下为警告类型
Warning 警告的基类
DeprecationWarning 关于被弃用的特征的警告
FutureWarning 关于构造将来语义会有改变的警告
OverflowWarning 旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning 关于特性将会被废弃的警告
RuntimeWarning 可疑的运行时行为(runtime behavior)的警告
SyntaxWarning 可疑的语法的警告
UserWarning 用户代码生成的警告

详见:help(builtins)

课后练习

写一个函数 get_age() 用来获取一个人的年龄信息
    此函数规定用户只能输入1~140之间的整数,如果用户输入其它的数则直接触发ValueError类型的错误!

def get_age():
    ...
try:
    age = get_age()
    print("用户输入的年龄是:", age)
except ValueError as err:
    print("用户输入的不是1~140的整数,获取年龄失败!")

参考答案

def get_age():
    age = int(input('请输入: '))
    if age < 0 or age > 140:
        raise ValueError("年龄范围错误")
    return age

Python文件操作

文件操作是Python中常见的任务之一,用于创建、读取、写入和管理文件。以下是一些常见的文件操作任务的思路、总结和示例代码:

1. 打开文件

要执行文件操作,首先需要打开文件。使用open()函数可以打开文件,指定文件名以及打开模式(读取、写入、追加等)。

图片描述
# 打开一个文本文件以读取内容
file = open("example.txt", "r")

2. 读取文件

一旦文件被打开,可以使用不同的方法来读取文件内容。

图片描述
# 读取整个文件内容
content = file.read()

# 逐行读取文件内容
for line in file:  #直接遍历文件对象,每次读取一行。这种方式更内存友好,因为不需要将所有行读入内存。
    print(line)
with open('example.txt', 'r') as file:
    lines = file.readlines() # 读取文件的所有行,并将其作为一个列表返回。
    for line in lines:
        print(line, end='') 代码和file = open("example.txt", "r")for line in file:
    print(line) 代码的区别

3. 写入文件

要写入文件,需要打开文件以写入模式(‘w’),然后使用write()方法。

# 打开文件以写入内容
file = open("example.txt", "w")

# 写入内容
file.write("这是一个示例文本。")

4. 关闭文件

完成文件操作后,应该关闭文件,以释放资源和确保文件的完整性。

file.close()

5. 使用with

更安全的方法是使用with语句,它会自动关闭文件。

with open("example.txt", "r") as file:
    content = file.read()
    # 文件自动关闭

6. 检查是否存在

可以使用os.path.exists()来检查文件是否存在。

import os

if os.path.exists("example.txt"):
    print("文件存在")

7. 处理异常

在文件操作中,可能会出现各种异常情况,例如文件不存在或没有权限。在文件操作中捕获这些异常是个好习惯。

try:
    with open("example.txt", "r") as file:
        content = file.read()
except FileNotFoundError:
    print("文件不存在")
except Exception as e:
    print(f"发生错误:{
      
      e}")

这些是文件操作的一些常见思路和示例代码。请根据你的具体需求和场景来调整代码。在进行文件操作时,要确保小心处理文件,以避免意外数据损坏或文件损坏。

除了打开、读取和写入文件之外,还有一些其他常见的文件操作,如复制、删除和改变文件名。以下是这些操作的思路和示例代码:

8. 复制文件

要复制文件,你可以使用shutil模块的copy方法。

import shutil

source_file = "source.txt"
destination_file = "destination.txt"

shutil.copy(source_file, destination_file)

9. 删除文件

要删除文件,可以使用os模块的remove方法。

import os

file_to_delete = "file_to_delete.txt"

if os.path.exists(file_to_delete):
    os.remove(file_to_delete)
    print(f"{
      
      file_to_delete} 已删除")
else:
    print(f"{
      
      file_to_delete} 不存在")

10. 修改名称

要改变文件名,可以使用os模块的rename方法。

import os

old_name = "old_name.txt"
new_name = "new_name.txt"

if os.path.exists(old_name):
    os.rename(old_name, new_name)
    print(f"文件名已更改为 {
      
      new_name}")
else:
    print(f"{
      
      old_name} 不存在")

猜你喜欢

转载自blog.csdn.net/b227737437/article/details/143368720