Python 3 结合文件打开和读取命令 - 需要关闭文件以及如何关闭?



我正在学习"Learn Python 3 the Hard Way",并使代码更加简洁。下面程序的第 11 行到第 18 行(第 1 行从 # 程序:p17.py 开始)与我的问题相关。打开和读取文件非常容易,并且很容易看到在处理文件时如何关闭打开的文件。原始部分被注释掉,我在第 16 行包含简洁的代码。我注释掉了导致错误的代码行(在第 20 行):

$ python3 p17_aside.py p17_text.txt p17_to_file_3.py 从p17_text.txt复制到p17_to_file_3.py 这是文本。

回溯(最近一次调用): 文件"p17_aside.py",第 20 行,在 indata.close() 属性错误:"str"对象没有属性"关闭">


代码如下:


# program: p17.py
# This program copies one file to another. It uses the argv function as well
# as exists - from sys and os.path modules respectively
from sys import argv
from os.path import exists
script, from_file, to_file = argv
print(f"Copying from {from_file} to {to_file}")
# we could do these two on one line, how?
#in_file = open(from_file)
#indata = in_file.read()
#print(indata)
# THE ANSWER -
indata = open(from_file).read()
# The next line was used for testing
print(indata)
# indata.close()

所以我的问题是我应该避免如上所述组合命令的做法,还是有没有办法正确处理这种情况,以便在应该关闭文件时关闭文件?在这种情况下,是否有必要处理关闭文件的情况?

上下文管理器和with语句是确保根据需要关闭文件的一种舒适方法:

with open(from_file) as fobj:
indata = fobj.read()

如今,您还可以使用类似 Path 的对象及其read_textread_bytes方法:

# This assumes Path from pathlib has been imported
indata = Path(from_file).read_text()

您看到的错误...是因为您没有尝试关闭文件,而是str已将其内容读入其中。您需要通过打开一个名称来分配返回的对象,然后读取并关闭该名称:

fobj = open(from_file)
indata = fobj.read()
fobj.close()  # This is OK

严格来说,您不需要关闭该文件,因为悬而未决的文件描述符会随着该过程而"破坏"。 在像这样的简短示例中,它的关注相对较少。


我希望我在评论中正确回答了后续问题,以进一步扩展这一点。

如果你想要一个命令,请查看上面的pathtlib.Path示例。

对于open,您无法在单个操作中执行readclose,并且不将open结果分配给变量。由于readclose都必须对open返回的同一对象执行。如果您这样做:

var = fobj.read()

现在,var是指从文件中读出的内容(因此您可以关闭的任何内容都不会有close方法)。

如果您这样做了:

open(from_file).close()

之后(但也在任何时候),您只需(再次)打开该文件并立即关闭它。顺便说一句。这将返回None,以防万一您想获取返回值。但它不会影响以前打开的文件句柄和类似文件的对象。除了确保您可以打开文件之外,它不会有任何实际目的。

但又一次。执行内务管理是一个很好的做法,但严格来说(尤其是像这样的简短代码)。如果您没有关闭文件并依靠操作系统在处理后进行清理。它会正常工作。

以下情况如何: # 打开文件并读取 indata = open(from_file).read() 打印(数据) # 这会关闭文件 - 与打开和读取相反 open(from_file).close()

最新更新