了解Python的“ with”语句
我试图了解这些之间是否存在差异,以及该差异可能是什么。
选项一:
file_obj = open('test.txt', 'r')
with file_obj as in_file:
print in_file.readlines()
选项二:
with open('test.txt', 'r') as in_file:
print in_file.readlines()
我知道,对于选项一,file_obj
with块之后处于闭合状态。
-
我不知道为什么没有人提到这一点,因为这是工作方式
with
的基础。与Python中的许多语言功能一样,with
在后台调用特殊方法,这些方法已经为内置Python对象定义,并且可以由用户定义的类覆盖。在with
特定情况下(和上下文管理器),方法是__enter__
和__exit__
。请记住,在Python中, 所有东西都是对象
-甚至是文字。这就是为什么您可以做类似的事情'hello'[0]
。因此,是否直接使用由以下文件返回的文件对象并不重要open
:with open('filename.txt') as infile: for line in infile: print(line)
或先使用其他名称存储(例如,将长行分开):
the_file = open('filename' + some_var + '.txt') with the_file as infile: for line in infile: print(line)
因为最终的结果是
the_file
,infile
和返回值open
都指向同一个对象,这就是with
被调用__enter__
和__exit__
方法上。内置文件对象的__exit__
方法是关闭文件的方法。