# 文件和异常

# 读写文件

在处理文件对象时,最好使用 with 关键字。优点是,子句体结束后,文件会正确关闭,即便触发异常也可以。而且,使用 with 相比等效的 try-finally 代码块要简短得多,如果没有使用 with 关键字,则应调用 f.close() 关闭文件,即可释放文件占用的系统资源。


# 读取每行的数据
with open('a.txt','r+' encoding="utf-8") as f:
    for line in f:
    print(line, end='')

# 将 json 与列表进行相互转换
import json  
  
# 假设你有一个 list  
my_list = ['apple', 'banana', 'cherry']  
  
# 使用 json.dumps() 将其转换为 JSON 字符串  
json_string = json.dumps(my_list)  

# 使用 json.loads() 将其转换回 list
my_list = json.loads(json_string)    

print(type(json_string),json_string)  # 输出: '["apple", "banana", "cherry"]'

print(type(my_list),my_list)

json模块主要有四个比较重要的函数,分别是:

  • dump - 将Python对象按照JSON格式序列化到文件中

  • dumps - 将Python对象处理成JSON格式的字符串

  • load - 将文件中的JSON数据反序列化成对象

  • loads - 将字符串的内容反序列化成Python对象

# 异常

使用关键字触发异常raise,使用 try except 捕获异常。

一个 except 子句中的类匹配的异常将是该类本身的实例或其所派生的类的实例(但反过来则不可以 --- 列出派生类的 except 子句 不会匹配其基类的实例)。 例如,下面的代码将依次打印 B, C, D:

class B(Exception):
    pass

class C(B):
    pass

class D(C):
    pass

for cls in [B, C, D]:
    try:
        raise cls()
    except D:
        print("D")
    except C:
        print("C")
    except B:
        print("B")

请注意如果颠倒 except 子句 的顺序(把 except B 放在最前),则会输出 B, B, B --- 即触发了第一个匹配的 except 子句。

try ... except 语句具有可选的 else 子句,该子句如果存在,它必须放在所有 except 子句 之后。 它适用于 try 子句 没有引发异常但又必须要执行的代码。

如果存在 finally 子句,则 finally 子句是 try 语句结束前执行的最后一项任务。不论 try 语句是否触发异常,都会执行 finally 子句。

  • 如果执行 try 子句期间触发了某个异常,则某个 except 子句应处理该异常。如果该异常没有 except 子句处理,在 finally 子句执行后会被重新触发。

  • except 或 else 子句执行期间也会触发异常。 同样,该异常会在 finally 子句执行之后被重新触发。

  • 如果 finally 子句中包含 break、continue 或 return 等语句,异常将不会被重新引发。

  • 如果执行 try 语句时遇到 break,、continue 或 return 语句,则 finally 子句在执行 break、continue 或 return 语句之前执行。

  • 如果 finally 子句中包含 return 语句,则返回值来自 finally 子句的某个 return 语句的返回值,而不是来自 try 子句的 return 语句的返回值。

def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        print("division by zero!")
    else:
        print("result is", result)
    finally:
        print("executing finally clause")


divide(2,1)
# result is 2.0
# executing finally clause


divide(2,0)
# division by zero!
# executing finally clause

divide('2','0')
# executing finally clause
# Traceback (most recent call last):