Python输入输出实验报错:ValueError: 对已关闭文件执行I/O操作
问题分析与解决
问题场景
需要实现以下功能:
- 询问用户要存储的数字数量,逐个输入后保存至
numbers1.txt - 重复上述流程将数字保存至
numbers2.txt - 读取两个文件的对应行,将每行整数相乘后累加到初始值为0的
scalar_product变量中,任一文件读取至末尾时停止
但在执行相乘累加环节时触发ValueError: I/O operation on closed file。
错误原因
你把numfile1.close()和numfile2.close()写在了while循环内部,第一次循环执行后就直接关闭了两个文件。当循环进入第二次迭代,再次调用readline()时,文件已经处于关闭状态,因此报错。
修正方案
方案1:调整关闭文件的位置
把关闭文件的代码移到while循环外部,等整个循环执行完毕后再关闭文件:
def main(): num = int(input("How many numbers would you like to store")) numbers1 = open('numbers1.txt', 'w') for count in range(1, num + 1): nums = input("Enter each number individually {}:".format(count)) numbers1.write(str(nums) + "\n") numbers1.close() def main_two(): num2 = int(input("How many numbers would you like to store")) numbers2 = open('numbers2.txt', 'w') for count in range(1, num2 + 1): nums2 = input("Enter each number individually {}:".format(count)) numbers2.write(str(nums2) + "\n") numbers2.close() main() main_two() numfile1 = open("numbers1.txt","r") numfile2 = open("numbers2.txt","r") scalar_product = 0 number1 = numfile1.readline() number2 = numfile2.readline() while number1 != "" and number2 != "": scalar_product += int(number1.strip()) * int(number2.strip()) # 去掉换行符,避免转int出错 number1 = numfile1.readline() number2 = numfile2.readline() # 关闭文件移到循环外面 numfile1.close() numfile2.close() print(scalar_product) # 打印结果验证
方案2:使用with语句(更推荐)
with语句会自动管理文件资源,无需手动调用close(),能彻底避免这类手动管理文件的错误:
def main(): num = int(input("How many numbers would you like to store")) with open('numbers1.txt', 'w') as numbers1: for count in range(1, num + 1): nums = input("Enter each number individually {}:".format(count)) numbers1.write(f"{nums}\n") def main_two(): num2 = int(input("How many numbers would you like to store")) with open('numbers2.txt', 'w') as numbers2: for count in range(1, num2 + 1): nums2 = input("Enter each number individually {}:".format(count)) numbers2.write(f"{nums2}\n") main() main_two() scalar_product = 0 with open("numbers1.txt","r") as numfile1, open("numbers2.txt","r") as numfile2: # zip会在任一文件读完后自动停止,刚好符合需求 for line1, line2 in zip(numfile1, numfile2): scalar_product += int(line1.strip()) * int(line2.strip()) print(scalar_product)
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

