Python 在打开和读取文件时,是否需要关闭文件以进行比较;如果;陈述
比较这些文件后是否需要关闭它们?我知道我需要做以下事情,但这有什么不同吗Python 在打开和读取文件时,是否需要关闭文件以进行比较;如果;陈述,python,Python,比较这些文件后是否需要关闭它们?我知道我需要做以下事情,但这有什么不同吗 if open(file1).read() == open(file2).read(): print('match') 是的,你知道。您还可以使用with关键字单独打开每个文件,并获取内容以比较它们。这将在文件指针离开作用域时为您关闭它 在您的情况下,如下所示: target = open(file1) 并在这里进一步解释: 是的,你知道。您还可以使用with关键字单独打开每个文件,并获取内容以比较它们。这将在
if open(file1).read() == open(file2).read():
print('match')
是的,你知道。您还可以使用
with
关键字单独打开每个文件,并获取内容以比较它们。这将在文件指针离开作用域时为您关闭它
在您的情况下,如下所示:
target = open(file1)
并在这里进一步解释:
是的,你知道。您还可以使用
with
关键字单独打开每个文件,并获取内容以比较它们。这将在文件指针离开作用域时为您关闭它
在您的情况下,如下所示:
target = open(file1)
并在这里进一步解释:
在您描述的两种情况下(命名或未命名的文件对象),如果未能显式地
关闭
,文件将(主要)在引用解释器(称为CPython)上确定地工作(因为它是引用计数的),但在备用解释器上的行为不确定(几乎所有的函数都是垃圾收集的,没有引用计数,因此清理可能不会发生,或者可能会被任意延迟)。即使在CPython上分配给像target
这样的名称,通常在有问题的函数返回时,隐式关闭也会立即发生(禁止打开的文件参与引用循环,该循环会无限期延迟清理)
最佳实践是始终将与
语句一起使用,无论是否指定了名称,都可以保证对所有Python解释器进行确定性清理:
with open(file1, 'r') as f:
content1 = f.read()
with open(file2, 'r') as f:
content2 = f.read()
if content1 == content2:
print('match')
您仍然不需要在此处调用
close
,因为with
语句保证在执行流离开with
块时,任何无法从解释器硬退出的操作(例如,通过调用os.\u exit
或触发segfault)都将关闭文件(通过返回、异常冒泡等)。在您描述的两种情况下(命名或未命名的文件对象),如果未能显式关闭
文件,文件将(主要)在引用解释器(称为CPython)上决定性地工作(因为它是引用计数的),但在备用解释器上的行为是不确定的(几乎所有解释器都是垃圾收集的,没有引用计数,因此清理可能不会发生,或者可能会被任意延迟)。即使在CPython上为像target
这样的名称赋值,隐式关闭通常会在相关函数返回时立即发生(禁止打开的文件参与引用循环,该循环会无限期延迟清理)
最佳实践是始终将与
语句一起使用,无论是否指定了名称,都可以保证对所有Python解释器进行确定性清理:
with open(file1, 'r') as f:
content1 = f.read()
with open(file2, 'r') as f:
content2 = f.read()
if content1 == content2:
print('match')
您仍然不需要在此处调用close
,因为with
语句保证在执行流离开with
块时,任何无法从解释器硬退出的操作(例如,通过调用os.\u exit
或触发segfault)都将关闭文件(通过return
ing、异常冒泡等)。这没有什么不同。open(file1.read()
相当于temp=open(file1)
后跟temp.read()
.CPython通常可能会让您逍遥法外,但您确实应该使用with
语句来控制关闭文件。这没有什么不同。open(file1.read()
相当于temp=open(file1)
后跟temp.read()
.CPython通常可能会让您逍遥法外,但您确实应该使用with
语句来控制关闭文件。@Graipher:注意:这项功能是在Python 2.7/3.1中引入的,因此使用真正古老的解释器的人不会拥有它,但坦率地说,如果您决定束缚手脚,继续运行2.6或更早版本,那就太好了elf造成了痛苦,你应该得到你应得的。:-@Graipher:Note:这一特性是在Python 2.7/3.1中引入的,所以使用真正古老的解释器的人不会得到它,但坦率地说,如果你决定绑住你的手,继续运行2.6或更早版本,那就是自我造成的痛苦,你应该得到你应得的。:-)如果一个文件不匹配,我可以在with
块中使用copyfile
将一个文件复制到另一个文件吗?@kysevenle:应该可以;shutil.copyfile
打开文件本身,因此它与您自己打开的文件对象无关。我可以在with
blo中使用copyfile
如果文件不匹配,是否将一个文件复制到另一个文件?@kysevenle:应该可以;shutil.copyfile
会打开文件本身,因此它与您自己打开的文件对象无关。