我应该将大部分代码放在 with 语句中吗?蟒蛇

问题描述 投票:0回答:2

我注意到大多数展示如何使用 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-statement conceptual
2个回答
1
投票

在Python中,with语句用简洁的简写代替了try-catch块。更重要的是,它确保在处理资源后立即关闭资源。因此,当您处理 txt 文件(对于本例)时,您不需要在处理后保持其打开状态。因为您的

list
已生成并保存。对于大文件来说,防止高内存使用会更有效。如果文件不是外部的,则不需要 with 语句,因为它已经在此程序中。

什么是内部格式和外部格式? 内部格式:内部格式是数据在程序中存储的方式。 外部格式:外部格式是数据在文件中存储的方式。 对于此示例,

file.txt
是外部文件,
list
是内部文件。


0
投票

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
语句保持打开状态的时间更长,但内存使用量应该更低。

© www.soinside.com 2019 - 2024. All rights reserved.