在Python中,关键字with被称作上下文管理语句,其特点在于能够自动管理资源,能够保证退出代码块时自动恢复上下文。以文件操作为例,很多人会像下面的代码这样写:
fp = open('test.txt', 'w')
fp.write('Hello world')
fp.close()
这也是文件操作的标准套路:打开文件-->读写文件-->关闭文件,看上去也中规中矩 。但是,这样的代码还是不够Pythonic,一来代码不够简洁,再就是一旦打开文件和关闭文件之间的代码出现问题抛出异常,后面的代码就无法执行了,无法正常关闭文件。例如下面的代码:
fp = open('test.txt', 'w')
fp.write('Hello world')
fp.write(str(1/0))
fp.close()
上面的代码会抛出异常,从而导致关闭文件的代码没有执行,从而导致写入的内容并没有真正保存到磁盘文件中去,当前文件夹中的test.txt是空的,里面没有内容。
在进行文件内容操作时,建议使用上下文管理语句with,使用下面的写法,一来不用专门编写关闭文件的close()代码,二来可以保证文件总是能被关闭,即使是代码块抛出异常导致程序崩溃。
with open('test.txt', 'w') as fp:
fp.write('Hello world')
fp.write(str(1/0))
可以发现,当前文件夹中的test.txt文件中保存了第一次写入的字符串Hello world。
with关键字还支持同时管理多个资源,例如:
with open('test.txt') as src, open('dst.txt', 'w') as dst:
dst.write(src.read())
另外,with关键字也适用于数据库连接,例如:
import sqlite3
with sqlite3.connect('database.db') as conn:
cur = conn.cursor()
for record in cur.execute('SELECT * FROM students'):
print(record)