python - Python程序说文件已关闭但应该打开
问题描述
我有这个 Python 程序:
#! python3
# random_quiz_generator.py - Creates quizzes with questions and answers in random order, along with the answer key.
import random
# The quiz data. Keys are states and values are their capitals
capitals = {'Alabama': 'Montgomery',
.......
'Wyoming': 'Cheyenne'
}
# Generate 35 quiz files
for quiz_num in range(35):
# create the quiz and answer key files
quiz_file = open(f'capitalsquiz{quiz_num + 1}.txt', 'w')
answer_key_file = open(f'capitalsquiz_answers{quiz_num +1}.txt', 'w')
# write out the header for the quiz
quiz_file.write('Name:\n\nDate:\n\nPeriod:\n\n')
quiz_file.write((' ' * 20) + f'State Capitals Quiz (Form{quiz_num +1})')
quiz_file.write('\n\n')
# shuffle the order of the states
states = list(capitals.keys())
random.shuffle(states)
# loop through all 50 states, making a question for each
for question_num in range(50):
# get right and wrong answers
correct_answer = capitals[states[quiz_num]]
wrong_answers = list(capitals.values())
del wrong_answers[wrong_answers.index(correct_answer)]
wrong_answers = random.sample(wrong_answers, 3)
answer_options = wrong_answers + [correct_answer]
random.shuffle(answer_options)
# write the question and answer options to the quiz file
quiz_file.write(f'{question_num + 1}. What is the capital of {states[question_num]}?\n')
for i in range(4):
quiz_file.write(f" {'ABCD'[i]}. {answer_options[i]}\n")
quiz_file.write('\n')
# write the answer key to a file
answer_key_file.write(f"{question_num + 1}. {'ABCD'[answer_options.index(correct_answer)]}")
quiz_file.close()
answer_key_file.close()
我收到此错误:
Traceback (most recent call last):
File "/RandomQuizGenerator/random_quiz_generator.py", line 85, in <module>
quiz_file.write(f'{question_num + 1}. What is the capital of {states[question_num]}?\n')
ValueError: I/O operation on closed file.
我不明白为什么这个文件会被关闭。在quiz_file = open(f'capitalsquiz{quiz_num + 1}.txt', 'w')
我关闭它之前它不应该保持打开状态吗?
解决方案
问题是您在循环之前打开文件并在最后一行的每次迭代中关闭它,以便在第二次迭代时for question_num in range(50)
关闭它。
尝试移出answer_key_file.close()
for 循环或使用context manager,您不必close
手动打开文件。
例如:
for quiz_num in range(35):
# create the quiz and answer key files
with open(f'capitalsquiz{quiz_num + 1}.txt', 'w') as quiz_file, open(f'capitalsquiz_answers{quiz_num +1}.txt',
'w') as answer_key_file:
# write out the header for the quiz
quiz_file.write('Name:\n\nDate:\n\nPeriod:\n\n')
quiz_file.write((' ' * 20) + f'State Capitals Quiz (Form{quiz_num +1})')
quiz_file.write('\n\n')
# shuffle the order of the states
states = list(capitals.keys())
random.shuffle(states)
# loop through all 50 states, making a question for each
for question_num in range(50):
# get right and wrong answers
correct_answer = capitals[states[quiz_num]]
wrong_answers = list(capitals.values())
del wrong_answers[wrong_answers.index(correct_answer)]
wrong_answers = random.sample(wrong_answers, 3)
answer_options = wrong_answers + [correct_answer]
random.shuffle(answer_options)
# write the question and answer options to the quiz file
quiz_file.write(f'{question_num + 1}. What is the capital of {states[question_num]}?\n')
for i in range(4):
quiz_file.write(f" {'ABCD'[i]}. {answer_options[i]}\n")
quiz_file.write('\n')
# write the answer key to a file
answer_key_file.write(f"{question_num + 1}. {'ABCD'[answer_options.index(correct_answer)]}")
推荐阅读
- php - 继续检查 Laravel 中的 if 语句
- r - 在 R 中将列名向左移一位
- sql - 如何生成具有不同表中电影平均分数的 SQL 查询?
- python - TensorFlow 数据集 .map() 方法不适用于内置 tf.keras.preprocessing.image 函数
- antlr - ANTLR 规则匹配不带引号或带引号的多行字符串
- android - 标题名称改造 kotlin 中 3 处的意外字符 0x20
- html - 带有 html 代码的 dbc.button - 整个按钮不可点击
- python - 如何在熊猫中将 if/else 转换为 np.where
- python - 为什么 python 不能正确地解决这个矩阵?
- sql - 在 SQL 数据库中获取所有同名但大小写不同的数据库对象?