首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python 3结合了文件打开和读取命令-需要关闭一个文件以及如何关闭?

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

Stack Overflow用户
提问于 2018-07-13 03:26:59
回答 2查看 470关注 0票数 0

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

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

回溯(最近一次调用):indata.close() AttributeError中的文件"p17_aside.py",第20行:'str‘对象没有'close’属性

代码如下:

代码语言:javascript
复制
# 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()

所以我的问题是,我应该避免像上面那样组合命令的做法,还是有一种方法可以正确地处理这种情况,这样文件就会在应该关闭的时候关闭?在这种情况下,是否有必要处理关闭文件的情况?

EN

回答 2

Stack Overflow用户

发布于 2018-07-13 04:14:09

Context managerwith语句是确保您的文件按需关闭的一种舒适的方法:

代码语言:javascript
复制
with open(from_file) as fobj:
    indata = fobj.read()

现在,您还可以使用类似路径的对象及其read_textread_bytes方法:

代码语言:javascript
复制
# This assumes Path from pathlib has been imported
indata = Path(from_file).read_text()

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

代码语言:javascript
复制
fobj = open(from_file)
indata = fobj.read()
fobj.close()  # This is OK

严格地说,您不需要关闭该文件,因为挂起的文件描述符将被进程“重击”。Esp。在这样一个简短的示例中,它将是相对较小的问题。

我希望我在评论中正确地得到了后续问题,以便对此进行更多的扩展。

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

使用open本身,您不能在不将read的结果赋给变量的情况下在单个操作中执行closeopen。因为readclose都必须在open返回的同一对象上执行。如果您这样做了:

代码语言:javascript
复制
var = fobj.read()

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

如果你这样做了:

代码语言:javascript
复制
open(from_file).close()

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

但是再说一遍。这是一个很好的实践,执行内务,但严格地说(和特别是。在像这样的简短代码中)。如果您没有关闭该文件,并依赖操作系统在您的进程之后进行清理。它会工作的很好。

票数 2
EN

Stack Overflow用户

发布于 2018-07-15 02:01:10

#打开并读取文件# indata = open(from_file).read() print(indata) #这将关闭文件-这与打开并读取open(from_file).close()正好相反

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51313112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档