您是否需要在打开时关闭文件并在" if"中进行比较。声明?

时间:2018-03-20 21:45:34

标签: python

if open(file1).read() == open(file2).read():
    print('match')

比较后我需要关闭这些文件吗?我知道在做以下事情时我需要,但这有什么不同吗?

target = open(file1)

2 个答案:

答案 0 :(得分:5)

在这两种情况下,您描述(命名或未命名的文件对象),未能显式close该文件将(通常)确定性地在引用解释器上工作,称为CPython(因为它是引用计数的),但是表现得很好在替代解释器上非确定性地(几乎所有解释器都是垃圾收集,而不是参考计数,因此清理可能不会发生,或者可能会被任意延迟)。即使在CPython上分配像target这样的名称时,一旦有问题的函数返回,通常会发生隐式关闭(禁止打开文件参与引用循环,这可以无限期地延迟清理)。 / p>

最佳做法是始终使用with语句,无论您是否已分配名称,都可以在所有Python解释器上获得有保证的确定性清理:

with open(file1) as f1, open(file2) as f2:
    if f1.read() == f2.read():
        print('match')

你仍然不需要在这里调用close,因为with语句可以保证从解释器中退出硬件(例如通过调用os._exit或触发段错误) )当执行流程离开with块时(return,通过异常冒泡等),将关闭文件。)

答案 1 :(得分:1)

是的,。您还可以使用with关键字单独打开每个文件,并获取内容以进行比较。这将处理在离开范围时为您关闭文件指针。

在您的情况下,这将如下所示:

with open(file1, 'r') as f:
    content1 = f.read()
with open(file2, 'r') as f:
    content2 = f.read()

if content1 == content2:
    print('match')

在此进一步解释:

https://docs.python.org/2/tutorial/inputoutput.html