如何解决 Python 错误 ValueError: I/O Operation on Closed File
资源管理是编程中的一个重要因素。 但通常,程序员会在不知不觉中让内存块处于打开状态,这会导致内存溢出。
然而,本文着眼于 Python 中的一个错误:ValueError: I/O operation on closed file。 当程序员试图对在操作之间以某种方式关闭的文件执行操作时,就会发生这种情况。
ValueError: I/O operation on closed file 主要在三种情况下发生:
解决 Python 中由于缩进不当发生的错误 ValueError: I/O operation on closed file
假设程序员有一个 .csv 文件,试图使用 Python 编译器将其加载到内存中。 在 Python 中,必须创建一个对象变量来加载文件的内容以读取或写入文件。
让我们通过下面的程序来理解这一点:
import csv
# Open the file in Read mode
with open("sample_submission.csv", "r") as employees:
read_csv = csv.reader(employees)
此程序导入库包 csv 以读取 .csv 文件。 在第二行代码中,程序使用 with 语句创建异常处理块,并使用关键字 r 将 .csv 文件 sample_submission.csv 存储在对象 employees 内部作为可读实体。
我们需要分配一些内存来读取实体员工的内存。 代码的第 3 行分配了一个内存块给 read_csv 来存储来自 employees 的内容。
如果程序员想要显示 .csv 文件中的行,需要在 for 循环中打印对象 read_csv 中的行,就像下面的代码一样:
import csv
# Open the file in Read mode
with open("sample_submission.csv", "r") as employees:
read_csv = csv.reader(employees)
# iterate and print the rows of csv
for row in read_csv:
print("Rows: ", row)
但是当程序员试图编译这段代码时,收到一个错误:
"C:\Users\Win 10\main.py"
Traceback (most recent call last):
File "C:\Users\Win 10\main.py", line 8, in <module>
for row in read_csv:
ValueError: I/O operation on closed file.
Process finished with exit code 1
因为异常处理语句with 发生 ValueError: I/O operation on closed file 错误。 如前所述,with 语句创建一个异常处理块,一旦编译器离开该块,内部启动的任何操作都会终止。
在上面的程序中,一个缩进错误导致了这个错误。 Python 编译器不使用分号来标识行尾; 相反,它使用空间。
在代码中,for 循环是在 with 块之外创建的,因此关闭了文件。 尽管 for 循环写在 with 的下面,但不正确的缩进使编译器认为 for 循环在 with 块之外。
解决此问题的方法是确定正确的缩进,如下所示:
import csv
with open("sample_submission.csv", "r") as employees:
read_csv = csv.reader(employees)
# for loop is now inside the with block
for row in read_csv:
print("Rows: ", row)
输出:
"C:\Users\Win 10\main.py"
Rows: ['Employee ID', 'Burn Rate']
Rows: ['fffe32003000360033003200', '0.16']
Rows: ['fffe3700360033003500', '0.36']
Rows: ['fffe31003300320037003900', '0.49']
Rows: ['fffe32003400380032003900', '0.2']
Rows: ['fffe31003900340031003600', '0.52']
Process finished with exit code 0
解决 Python 中由于在for循环中关闭文件发生的异常 ValueError: I/O operation on closed file
此示例说明如何在不使用 with 语句的情况下发生 ValueError: I/O operation on closed file 。 当 Python 脚本打开文件并在循环内写入内容时,它必须在程序结束时关闭。
但是 ValueError: I/O operation on closed file 可能是由于在循环内关闭了一个显式文件而引起的。 如上所述,with 块会关闭其中已启动的任何内容。
但是在使用 for 循环等的情况下,当文件在循环中途关闭时,会发生 ValueError: I/O operation on closed file。 让我们通过下面的程序看看这是如何发生的:
a = 0
b = open("sample.txt", "r")
c = 5
f = open("out"+str(c)+".txt", "w")
for line in b:
a += 1
f.writelines(line)
if a == c:
a = 0
f.close()
f.close()
上面的代码从文件 sample.txt 中读取内容,然后将这些内容写入名为 out(value of c).txt
的新文件中。
变量 b 加载了 sample.txt 文件,而变量 f 用于写入新文件。 for 循环运行 b 中加载的文件中的行数。
每次迭代增加a,而在a=5的迭代中,a的值重置为零。
完成该过程后, f.close()
被使用了两次。 第一个 f.close 清除 f,而第二个清除 b。
但是程序必须在文件关闭之前运行更多的迭代。 编译程序时,它会给出以下输出:
"C:\Users\Win 10\main.py"
Traceback (most recent call last):
File "C:\Users\Win 10\main.py", line 8, in <module>
f.writelines(line)
ValueError: I/O operation on closed file.
Process finished with exit code 1
发生这种情况是因为文件在 for 循环内关闭,这使得它无法为后续迭代读取文件。
由于此错误是意外导致的,解决它需要返回代码并重新检查文件关闭的位置。 如果它是一个 for 循环,那么一个文件应该在循环缩进之外关闭,这允许循环完成它的所有迭代,然后释放内存。
a = 0
b = open("sample.txt", "r")
c = 5
f = open("out"+str(c)+".txt", "w")
for line in b:
a += 1
f.writelines(line)
if a == c:
a = 0
f.close()
此处,文件在 for 循环缩进之外关闭,因此编译器在完成所有迭代后关闭文件。
编译代码时,它在创建名为 out5.txt 的文件时不会抛出任何错误:
"C:\Users\Win 10\main.py"
Process finished with exit code 0
解决对关闭的文件执行写操作导致的 ValueError: I/O operation on closed file
这是一个案例场景,程序员向之前已关闭的文件发出书面指令,编译它会产生 ValueError: I/O operation on closed file 错误。
让我们看一个例子:
with open("gh.txt", 'w') as b:
b.write("Apple\n")
b.write("Orange \n")
b.write("Guava \n")
b.close()
b.write("grapes")
该程序加载一个 .txt 文件作为对象 b。 然后这个对象变量b用于执行.txt文件内部的写操作。
编译此代码时,发生 ValueError: I/O operation on closed file。
"C:\Users\Win 10\main.py"
Traceback (most recent call last):
File "C:\Users\Win 10\main.py", line 6, in <module>
b.write("grapes")
ValueError: I/O operation on closed file.
Process finished with exit code 1
这是由 b.close()
语句引起的,该语句覆盖了书面语句。 编译器不再让文件被写入,即使在 with 块内也是如此。
要解决此问题,如果需要添加 b.close,则应在不使用 with 语句的情况下重写程序:
b = open("gh.txt", 'w')
b.write("Apple\n")
b.write("Orange \n")
b.write("Guava \n")
b.write("grapes")
b.close()
或者必须从 with 语句中删除 b.close()
语句以使其运行:
with open("gh.txt", 'w') as b:
b.write("Apple\n")
b.write("Orange \n")
b.write("Guava \n")
b.write("grapes")
两个代码块执行相同的工作,但使用 with 语句添加了异常处理并清理了代码。
总结
本文解释了可能导致 ValueError: I/O operation on closed file 的各种原因。 读者应该理解 with 语句并在以后正确使用它们。
相关文章
Python 中错误 ValueError: Invalid Literal for Float()
发布时间:2023/05/17 浏览次数:53 分类:Python
-
Python 中 ValueError: invalid literal for float()。 float() 函数无法将字符串类型转换为浮点数。 相反,它会抛出一个 ValueError,它可能会因您的 Python 版本而异。
Python 错误 TypeError: Unhashable Type: List
发布时间:2023/05/17 浏览次数:95 分类:Python
-
本文将讨论 TypeError: unhashable type: 'list' 以及如何在 Python 中修复它。因为 Python 字典只接受可散列数据类型作为它们的键,而列表是不可散列的。
Python 中错误 AttributeError: __Exit__
发布时间:2023/05/17 浏览次数:113 分类:Python
-
尝试用 Python 开发新程序时出错是很常见的。 AttributeError 是 Python 中最常见的错误之一。在本文中,我们将看看如何解决这个 AttributeError: __exit__ 错误,并且我们将通过相关示例和解释来讨论这
Python 错误 TypeError: __str__ Returned Non-String but Printing Output
发布时间:2023/05/17 浏览次数:142 分类:Python
-
本文旨在解决当我们尝试打印字符串而不是在函数中使用 return 语句时出现的问题。Python 错误TypeError: __str__ Returned Non-String but Printing Output
Python 中错误 Path Python3 (From --Python=Python3) Does Not Exist
发布时间:2023/05/17 浏览次数:141 分类:Python
-
错误 The path python3 (from --python=python3) does not exist 可能有几个原因。一种可能是您的系统上没有安装 Python 3。 另一种可能是您安装了多个版本的 Python,而您尝试使用的版本不在您的 PATH 中。
如何解决 Python 中 Urllib HTTP Error 403 Forbidden Message 错误
发布时间:2023/05/17 浏览次数:140 分类:Python
-
今天的文章解释了如何处理错误消息(异常),urllib.error.HTTPError: HTTP Error 403: Forbidden,当它遇到一个被禁止的资源时,由错误类代表请求类产生。Python 中的 urllib 模块
解决 Python ModuleNotFoundError 错误
发布时间:2023/05/17 浏览次数:199 分类:Python
-
此类错误的一个示例是 ModuleNotFoundError。 在本文中,我们将讨论在 Python 中解决 ModuleNotFoundError 的方法。
Python 中 Importerror: Install XLRD for Excel Support 错误
发布时间:2023/05/16 浏览次数:162 分类:Python
-
在本篇文章中,我们将探讨在 Python 中使用 Pandas 包时可能遇到以下错误的原因和解决方案。ImportError: Install xlrd >= 0.9.0 for Excel support 。让我们首先简要介绍一下 Pandas。
解决 Python 中 TypeError: An Integer Is Required 错误
发布时间:2023/05/16 浏览次数:102 分类:Python
-
在 Python 代码中发生的另一个最常见的错误是 TypeError。本文将展示我们如何在 Python 中得到 TypeError。 此外,我们将通过使用必要的示例和解释来讨论该主题,以使该主题更容易理解。