gpt4 book ai didi

Python 在一次 write() 后关闭文件

转载 作者:行者123 更新时间:2023-11-28 19:53:14 27 4
gpt4 key购买 nike

我在 macOS Sierra 10.12.16 和 Xcode 8.3.3 上使用 Python 2.7.10 版在演示程序中,我想在文件中写入 2 行文本。这应该分两步完成。在第一步中,方法 openNewFile() 被调用。该文件是用打开命令创建的,一行文本被写入文件。文件句柄是该方法的返回值。在第二步中,以文件句柄 fH 作为输入参数的方法 closeNewFile(fH) 被调用。应将第二行文本写入文件并关闭文件。但是,这会导致错误消息:

 Traceback (most recent call last):
File "playground.py", line 23, in <module>
myDemo.createFile()
File "playground.py", line 20, in createFile
self.closeNewFile(fH)
File "playground.py", line 15, in closeNewFile
fileHandle.writelines("Second line")
ValueError: I/O operation on closed file
Program ended with exit code: 1

在我看来,从一种方法到另一种方法处理文件可能是问题所在。

#!/usr/bin/env python
import os

class demo:
def openNewFile(self):
currentPath = os.getcwd()
myDemoFile = os.path.join(currentPath, "DemoFile.txt")
with open(myDemoFile, "w") as f:
f.writelines("First line")
return f

def closeNewFile(self, fileHandle):
fileHandle.writelines("Second line")
fileHandle.close()

def createFile(self):
fH = self.openNewFile()
self.closeNewFile(fH)

myDemo = demo()
myDemo.createFile()

我做错了什么?如何解决这个问题?

最佳答案

您误解了 with....as 的作用。这段代码是这里的罪魁祸首:

 with open(myDemoFile, "w") as f:
f.writelines("First line")
return f

就在返回之前,with 关闭 文件,因此您最终会从函数返回一个关闭的文件。

我应该补充——在一个函数中打开一个文件并在不关闭它的情况下返回它(你的实际意图是什么)是主要的代码味道。也就是说,解决此问题的方法是摆脱 with...as 上下文管理器:

f = open(myDemoFile, "w") 
f.writelines("First line")
return f

对此的改进是摆脱上下文管理器,而是在 上下文管理器。不要有单独的打开和写入函数,不要分割你的 I/O 操作。

关于Python 在一次 write() 后关闭文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45909251/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com