# 文件和异常
# 读写文件
在处理文件对象时,最好使用 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):