Python with 关键字
Python 中的 with 语句用于异常处理,封装了 try…except…finally 编码范式,提高了易用性。
with 语句使代码更清晰、更具可读性, 它简化了文件流等公共资源的管理。
在处理文件对象时使用 with 关键字是一种很好的做法。
我们可以看下以下几种代码实例:不使用 with,也不使用 try…except…finally
实例
file.write('hello world !')
file.close()
以上代码如果在调用 write 的过程中,出现了异常,则 close 方法将无法被执行,因此资源就会一直被该程序占用而无法被释放。
接下来我们呢可以使用 try…except…finally 来改进代码:
实例
try:
file.write('hello world')
finally:
file.close()
以上代码我们对可能发生异常的代码处进行 try 捕获,发生异常时执行 except 代码块,finally 代码块是无论什么情况都会执行,所以文件会被关闭,不会因为执行异常而占用资源。
使用 with 关键字:
实例
file.write('hello world !')
使用 with 关键字系统会自动调用 f.close() 方法, with 的作用等效于 try/finally 语句是一样的。
我们可以在执行 with 关键字后检验文件是否关闭:实例
... read_data = f.read()
>>> # 查看文件是否关闭
>>> f.closed
True
with 语句实现原理建立在上下文管理器之上。
上下文管理器是一个实现 __enter__ 和 __exit__ 方法的类。
使用 with 语句确保在嵌套块的末尾调用 __exit__ 方法。
这个概念类似于 try...finally 块的使用。
实例
my_file.write('hello world!')
以上实例将 hello world! 写到 ./test_runoob.txt 文件上。
在文件对象中定义了 __enter__ 和 __exit__ 方法,即文件对象也实现了上下文管理器,首先调用 __enter__ 方法,然后执行 with 语句中的代码,最后调用 __exit__ 方法。 即使出现错误,也会调用 __exit__ 方法,也就是会关闭文件流。
实例
以下 Python 代码是一个简单的旅游计划管理工具,它从 5A.txt 文件中读取城市列表,并提供以下功能:
读取城市列表:从文件中读取以数字开头的城市名称,添加到旅游计划列表中。
删除城市:用户可以输入不想去的城市数量和序号,将对应的城市从计划中删除。
修改城市:用户可以选择修改某些城市的名称,更新旅游计划。
生成随机旅游计划:打乱城市顺序,并显示前五个城市作为最终的旅游推荐。
5A.txt 文件每行包含一个以数字开头的城市名称:
1. 北京 2. 上海 3. 广州 4. 深圳 5. 成都 6. 杭州 7. 西安 8. 重庆 9. 南京 10. 苏州
实例
try:
with open('5A.txt', 'r') as fp:
i = [line for line in fp if line[0].isdigit()]
except FileNotFoundError:
print("文件 '5A.txt' 未找到,请检查文件路径。")
exit()
travelList = []
# 添加旅游城市
for index, item in enumerate(i):
temp_1 = item.strip()[2:] # 使用 strip 去除行末的换行符
temp_1 = f"{index}#{temp_1}"
travelList.append(temp_1)
print("旅游计划城市:", travelList)
# 删除旅游城市
city_num = input('输入不想旅游城市的个数:')
try:
for _ in range(int(city_num)):
index = int(input('输入不想旅游城市的序号(第1个城市索引为0)'))
if 0 <= index < len(travelList):
travelList.pop(index)
print("旅游计划城市:", travelList)
else:
print("输入的序号超出范围。")
except ValueError:
print("请输入有效的整数。")
# 修改旅游城市
city_num = input('输入修改计划旅游的城市个数:')
try:
for _ in range(int(city_num)):
index = int(input('输入修改计划旅游的城市序号(第1个城市索引为0)'))
if 0 <= index < len(travelList):
city_name = input('输入修改计划旅游的城市名称:')
travelList[index] = city_name
print('旅游计划城市:', travelList)
else:
print("输入的序号超出范围。")
except ValueError:
print("请输入有效的整数。")
shuffle(travelList)
print('请领取您的TOPS旅游计划:', travelList[:5])
执行以上代码,输出结果类似如下:
旅游计划城市: ['0# 北京', '1# 上海', '2# 广州', '3# 深圳', '4# 成都', '5# 杭州', '6# 西安', '7# 重庆', '8# 南京', '9#. 苏州'] 输入不想旅游城市的个数:0 输入修改计划旅游的城市个数:3 输入修改计划旅游的城市序号(第1个城市索引为0)4 输入修改计划旅游的城市名称:7 旅游计划城市: ['0# 北京', '1# 上海', '2# 广州', '3# 深圳', '7', '5# 杭州', '6# 西安', '7# 重庆', '8# 南京', '9#. 苏州']
点我分享笔记