Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在打开和读取文件时,是否需要关闭文件以进行比较;如果;陈述_Python - Fatal编程技术网

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
会打开文件本身,因此它与您自己打开的文件对象无关。