You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:40:29