我注意到大多数展示如何使用 with 语句的教程都将大部分代码保留在该语句中。保持它打开(除了再次访问内容之外)比将内容拉入列表并尽快关闭它有好处吗?
示例:
with open('file.txt') as f:
list = f.readlines()
# Code that does stuff with list
# end of with open
# vs
with open('file.txt') as f:
list = f.readlines()
# end of with open
# Code that does stuff with list
在Python中,with语句用简洁的简写代替了try-catch块。更重要的是,它确保在处理资源后立即关闭资源。因此,当您处理 txt 文件(对于本例)时,您不需要在处理后保持其打开状态。因为您的
list
已生成并保存。对于大文件来说,防止高内存使用会更有效。如果文件不是外部的,则不需要 with 语句,因为它已经在此程序中。
什么是内部格式和外部格式? 内部格式:内部格式是数据在程序中存储的方式。 外部格式:外部格式是数据在文件中存储的方式。 对于此示例,
file.txt
是外部文件,list
是内部文件。
with
语句通常用于确保尽快清理资源。因此,作为一般原则,保持 with
语句在尽可能短的时间内打开是保持较低资源使用率的最佳方法。
在您的示例中,资源是一个打开的文件,其开销相当低。但某些上下文管理器(例如数据库连接)可能代表更高的资源使用率,并从早期清理中受益。
这只是一般原则,并且存在使
with
声明保持更长时间的合法理由。例如:
资源复用
如果您稍后需要在代码中使用该文件,请将其保持打开状态以避免稍后重新打开它。
更高效的资源利用
在您的示例中,您将整个文件作为列表读入内存。如果您只需要处理每一行一次,您可能会受益于更长的
with
语句和迭代方法。
换句话说,而不是这个(将整个文件加载到内存中):
with open('file.txt') as f:
lines = f.readlines()
for line in lines:
print(line)
使用这个(一次只将一行加载到内存中):
with open('file.txt') as f:
for line in f:
print(line)
在第二个示例中,
with
语句保持打开状态的时间更长,但内存使用量应该更低。