文件未关闭时对已关闭文件的 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 操作。

正如我所提到的,所有三个文件(ffafofs)都是打开,并且无需在 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 &lt;string&gt;' requires string as left operand, not list 您需要将array 转换为字符串。也许"".join(array)

以上是关于文件未关闭时对已关闭文件的 I/O 操作的主要内容,如果未能解决你的问题,请参考以下文章

ValueError : 对已关闭文件的 I/O 操作

在 django 中使用“ImageKit”对已关闭文件进行 I/O 操作

在 Azure Synapse 笔记本 ValueError 中运行 nltk.download:对关闭的文件进行 I/O 操作

Linux操作系统基础I/O

Python 文件I/O

C 语言 文件操作