ValueError:Python 中关闭文件的 I/O 操作
ValueError: I/O operation on closed file in Python
Python“ValueError: I/O operation on closed file”发生在我们试图对一个关闭的文件执行操作时。要解决该错误,请确保在使用该with open()
语句时缩进尝试正确访问文件的代码。
下面是错误如何发生的示例。
主程序
import csv with open('employees.csv', 'w', newline='', encoding='utf-8') as csvfile: fieldnames = ['first_name', 'last_name'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) print(csvfile.closed) # 👉️ False # 👇️ forgot to indent code 👇️ # ⛔️ ValueError: I/O operation on closed file. print(csvfile.closed) # 👉️ True writer.writeheader() writer.writerow({'first_name': 'Alice', 'last_name': 'Smith'})
我们忘记缩进写入文件的代码,所以with open()
语句自动关闭了文件,我们对关闭的文件执行了 I/O 操作。
要解决这个错误,请确保正确缩进代码并将其移动到
with
语句中,不要混用制表符和空格。
主程序
import csv with open('employees.csv', 'w', newline='', encoding='utf-8') as csvfile: fieldnames = ['first_name', 'last_name'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) # ✅ code is now indented correctly writer.writeheader() writer.writerow({'first_name': 'Alice', 'last_name': 'Smith'}) writer.writerow({'first_name': 'Bob', 'last_name': 'Smith'})
with open()
即使抛出异常,语法也会自动关闭文件。
这是另一个例子。
主程序
file_name = 'example.txt' with open(file_name, 'w', encoding='utf-8') as my_file: # ✅ code is indented correctly my_file.write('first line' + '\n') my_file.write('second line' + '\n') my_file.write('third line' + '\n')
确保您没有在语句之后尝试访问文件的代码。
with open()
任何试图访问该文件的代码都需要正确缩进。
或者,您可以将文件对象存储到变量中并手动关闭它。
主程序
file_name = 'example.txt' my_file = open(file_name, 'w', encoding='utf-8') my_file.write('first line' + '\n') my_file.write('second line' + '\n') my_file.write('third line' + '\n') my_file.close() # 👈️ manually close file
请注意,最好使用with open()
语法,因为它会在我们完成后自动关闭文件。
您可以使用closed
文件对象的属性来检查它是否已关闭。
主程序
file_name = 'example.txt' with open(file_name, 'w', encoding='utf-8') as my_file: # ✅ code is correctly indented my_file.write('first line' + '\n') my_file.write('second line' + '\n') my_file.write('third line' + '\n') print(my_file.closed) # 👉️ False print(my_file.closed) # 👉️ True
最后一行代码没有缩进,所以此时文件已经关闭。
结论
Python“ValueError: I/O operation on closed file”发生在我们试图对一个关闭的文件执行操作时。要解决该错误,请确保在使用该with open()
语句时缩进尝试正确访问文件的代码。