文件未关闭时对已关闭文件的 I/O 操作
Posted
技术标签:
【中文标题】文件未关闭时对已关闭文件的 I/O 操作【英文标题】:I/O operation on closed file when the file is not closed 【发布时间】:2022-01-21 02:38:12 【问题描述】:我用 Python 编写了一段代码,它需要检查一些数组并确保其中不存在某些值。这些值是我这样定义的变量的形式:
tempArray = "".join(map(str,array))
dashTemp = tempArray[0:11]
dotTemp = tempArray[11:23]
spaceTemp = tempArray[23:35]
dashTemp = "".join(sorted(dashTemp))
dotTemp = "".join(sorted(dotTemp))
spaceTemp = "".join(sorted(spaceTemp))
然后我尝试检查这些值是否已经在我设置的现有文本文件中(我之前打开过):
if array in f or dashTemp in fa or dotTemp in fo or spaceTemp in fs:
f.close()
上面的代码工作得很好,但是当我把它改成下面的时候它就不起作用了:
if array in f or dashTemp in fa or dotTemp in fo or spaceTemp in fs or "6" in spaceTemp or "o" in spaceTemp:
f.close()
我收到错误“ValueError: I/O operation on closed file”。我不明白,因为我添加的内容与文件无关; spaceTemp 变量是唯一引用的新事物。我什至可以理解错误是否位于 f.close() 行,但不是。
文件“...”,第 76 行,在 gen 如果 f 中的数组或 fa 中的 dashTemp 或 fo 中的 dotTemp 或 fs 中的 spaceTemp 或 spaceTemp 中的“6”或 spaceTemp 中的“o”: ValueError: 对已关闭文件的 I/O 操作。
正如我所提到的,所有三个文件(f、fa、fo 和 fs)都是打开,并且无需在 spaceTemp 中添加“或“6”...”。
有什么想法吗?
更多上下文:
f = open("iterations.txt","r")
fa = open("dashes.txt","r")
fo = open("dots.txt","r")
fs = open("spaces.txt","r")
while restart == True:
while count < 36:
characterAdd = chars[random.randint(0,35)]
if not characterAdd in array:
array.append(characterAdd)
count += 1
else:
pass
tempArray = "".join(map(str,array))
dashTemp = tempArray[0:11]
dotTemp = tempArray[11:23]
spaceTemp = tempArray[23:35]
dashTemp = "".join(sorted(dashTemp))
dotTemp = "".join(sorted(dotTemp))
spaceTemp = "".join(sorted(spaceTemp))
if array in f or dashTemp in fa or dotTemp in fo or spaceTemp in fs or "6" in spaceTemp or "o" in spaceTemp:
f.close()
【问题讨论】:
没有更多上下文,我们无法说明为什么f
已经关闭。
您正在循环关闭文件f
,然后不再重新打开它。当您关闭它然后尝试在下一次迭代中再次使用它时会发生什么? in
这里将尝试读取文件(并且还将光标移动到文件 iirc 的末尾,这使得文件无法读取,直到您重新seek
开始)。
@vb4 最简单的答案是文件永远不会关闭,直到您将其添加到条件中(如果这是真的,这意味着该检查没有对原始条件做任何事情,因为它总是错误的)。
这里更重要的问题是,“你到底想做什么?”这可能不是解决方法。 为什么你要关闭文件流?你有检查它是否关闭的东西吗?也许只是获取读取值并对其进行测试?
要添加到@e.s.,这篇文章类似于XY Problem。请提供您的整体问题的背景(即 (x*) 而不仅仅是您尝试的解决方案(即 y)。
【参考方案1】:
看起来您正在测试文件中的某些内容是否正确。在这种情况下,将文件读取到变量并测试变量
with open("iterations.txt","r") as f:
iterations_text = f.read()
with open("dashes.txt", "r") as f:
dashes_text = f.read()
did_the_bad_thing_happen = False
while restart == True:
while count < 36:
characterAdd = chars[random.randint(0,35)]
if not characterAdd in array:
array.append(characterAdd)
count += 1
else:
pass
tempArray = "".join(map(str,array))
dashTemp = tempArray[0:11]
dotTemp = tempArray[11:23]
spaceTemp = tempArray[23:35]
dashTemp = "".join(sorted(dashTemp))
dotTemp = "".join(sorted(dotTemp))
spaceTemp = "".join(sorted(spaceTemp))
if array in iterations_text or dashTemp in dashes_text or ...:
did_the_bad_thing_happen = True
break # also, this might solve your problem!
如果您决定按照自己的方式行事,则应在使用break
关闭文件流后立即跳出循环,如上例所示。
【讨论】:
这似乎比我的方式更好,但是在填写其他文件打开/读数时,我在if array in iterations_text or dashTemp in dashes_text or dotTemp in dots_text or spaceTemp in spaces_text:
线上遇到了错误TypeError: 'in <string>' requires string as left operand, not list
您需要将array
转换为字符串。也许"".join(array)
以上是关于文件未关闭时对已关闭文件的 I/O 操作的主要内容,如果未能解决你的问题,请参考以下文章
在 django 中使用“ImageKit”对已关闭文件进行 I/O 操作
在 Azure Synapse 笔记本 ValueError 中运行 nltk.download:对关闭的文件进行 I/O 操作