在python中json.load文件的等效方法?

时间:2016-09-12 09:36:51

标签: python contextmanager

我经常在代码中看到这个:

with open(file_path) as f:
    json_content = json.load(f)

而且经常这样:

json_content = json.load(open(file_path))

我想知道后者是反模式还是两个版本之间的区别是什么。

3 个答案:

答案 0 :(得分:1)

当您使用上下文管理器时,它可以保证您的文件在块结束时自动关闭。 with statement通过使用close方法调用文件对象的__exit__()属性来完成此操作。

如文件所述:

  

with语句保证如果__enter__()方法返回   如果没有错误,则始终会调用__exit__()

了解更多功能https://docs.python.org/3.5/reference/compound_stmts.html#with

答案 1 :(得分:1)

json.load(open(file_path))依靠GC来关闭文件。这不是一个好主意:如果有人没有使用CPython,垃圾收集器可能没有使用引用计数(它会立即收集未引用的对象),例如一段时间后才收集垃圾。

由于文件句柄在关联对象被垃圾收集或显式关闭(.close().__exit__()来自上下文管理器)时关闭,因此文件将保持打开状态,直到GC启动。

使用with可确保文件在块保留后立即关闭 - 即使该块内发生异常,因此对于任何实际应用程序应始终首选。

答案 2 :(得分:0)

除了其他答案之外,上下文管理器与try-finally子句非常相似。

此代码:

with open(file_path) as f:
    json_content = json.load(f)

可以写成:

f = open(file_path)
try:
    json_content = json.load(f)
finally:
    f.close()

前者显然更可取。