在 Python 中,with 语句(也称为上下文管理器)是一个非常实用的特性,它主要用于简化对资源的管理,例如文件操作、网络连接、线程锁等。with 语句确保资源在使用完毕后,无论代码是否发生异常,都能被正确地清理和释放。
为什么要使用 with 语句?
在没有 with 语句的情况下,当我们操作文件或其他需要手动关闭的资源时,通常需要使用 finally 语句来确保资源被关闭,即使在操作过程中发生了错误。
示例:使用 finally 确保文件被关闭
f = None
try:
f = open('data/A.txt', 'r', encoding='utf-8')
result = f.read() + 1000
except TypeError as reason:
print(reason)
finally:
if f:
f.close()分析:
虽然 finally 语句能够确保资源被关闭,但代码显得有些冗长,并且很容易漏掉 close() 操作。
而 with 语句的引入正是为了解决这个问题。它提供了一种更简洁、更安全的方式来管理资源。当进入 with 块时,资源会被打开;当离开 with 块时(无论是正常退出还是发生异常),资源都会被自动关闭。
如何使用 with 语句?
在 Python 中,我们可以使用 with 语句来自动调用 close() 方法来关闭文件。对于上面这个例子,如果使用 with 语句来代替 try-except-finally 语句,此时代码如下。
with open('data/book.txt', 'r', encoding='utf-8') as f:
result = f.read() + 1000
print(result)with 语句只能帮我们关闭文件,并不能帮我们处理异常。如果在文件操作的过程中出现异常,还是需要使用 try except 语句来处理。因此对于上面这段代码,加上异常处理后,完整实现代码如下。
try:
with open('data/book.txt', 'r', encoding='utf-8') as f:
result = f.read() + 1000
print(result)
except FileNotFoundError:
print('文件不存在,请检查路径!')
except TypeError:
print('类型错误:不能将字符串与数字相加!')对于上面这段代码,它其实等价于我们之前学过的冗长的 try-except-finally 语句:
f = None
try:
f = open('data/book.txt', 'r', encoding='utf-8')
result = f.read() + 1000
print(result)
except FileNotFoundError:
print('文件不存在,请检查路径!')
except TypeError:
print('类型错误:不能将字符串与数字相加!')
finally:
if f:
f.close()对比一下就可以看出,使用 with 语句后,我们再也不用去写繁琐的 finally 和 f.close() 了!所以在实际项目开发中,我们是 100% 推荐使用 with 语句来管理文件等资源。
