Python二级试题:从带注释的论语文本中提取原文

题目


给出文件"论语.txt",其内容采用逐句“原文"与逐句“注释"相结合,通过【原文】标记《论语》原文内容,通过【注释】标记《论语》注释内容
编程要求:在代码模板中修改代码,提取“论语.txt"文件中的原文内容,输出保存到考生文件夹下,文件名为“论语-原文.txt”。要求:仅保留“论语.txt"文件中所有【原文】标签下面的内容,不保留标签,并去掉每行行首空格及行尾空格,无空行,去掉每行文字中所有小括号及内部数字。
论文.txt部分内容
【原文】
子曰(1):“学(2)而时习(3)之,不亦说(4)乎?有朋(5)自远方来,不亦乐(6)乎?人不知(7),而不愠(8),不亦君子(9)乎?”
【注释】
(1)子:中国古代对于有地位、有学问的男子的尊称,有时也泛称男子。《论语》书中“子曰”的子,都是指孔子而言。
(2)学:孔子在这里所讲的“学”,主要是指学习西周的礼、乐、诗、书等传统文化典籍。
(3)时习:在周秦时代,“时”字用作副词,意为“在一定的时候”或者“在适当的时候”。但朱熹在《论语集注》一书中把“时”解释为“时常”。“习”,指演习礼、乐;复习诗、书。也含有温习、实习、练习的意思。
代码模板

// 考生文件初始代码 PY301-1
fi = open("论语.txt", ______)
fo = open("论语-原文.txt", ______)
...
for line in fi:
...
fo.write(line.lstrip())
...
// 考生文件初始代码 PY301-2
fi = open("论语-原文.txt", ______)
fo = open("论语-提纯原文.txt", ______)
for line in fi:
...
line=line.replace(______)
...

编程思路

先不考虑代码模板的内容,先梳理编程思路,若我们自己写这个程序,该如何思考?
题目要求提取标签【原文】下面的内容,不包含标签【注释】下面的内容,这个需求要注意。另外一个需求是过滤原文内容每行的行首和行尾的空格,滤掉空行,并删除原文内容内的注释序号,包括小括号。第三个需求是将提取的内容写入到一个新的文本文件。
先看第一个需求,提取标签【原文】下面的内容,观察论文.tx格式,发现原文内容在【原文】标签
和【注释】标签之间,并且【原文】和【注释】各占一行,提取原文内容的思路如下:
设置一个标志,用于判断当前读取的是原文内容还是注释内容,按行读取文本内容,将文本内容存储到列表对象,遍历列表对象,判断当前行内容是否为【原文】,若为原文则设置标志位true,继续遍历后续行,若标志位true,并且当前行内容不是【注释】,则当前内容为原文,若当前行内容是【注释】,设置标志位为false。
再来看第二个需求,过滤原文内容行的首尾空格、并滤掉空行,同时删除原文内容内的注释序号,包括小括号。字符串对象的strip()函数可删除行首和行尾的空格,若当前行为空,则不写入文件。删除原文的内容的注释序号,可调用replace函数,使用空串替换注释序号。
第三个需求相对简单,使用open函数打开一个新文件,将原文内容写入文件。
完整代码

fi = open("论语1.txt","r",encoding='utf-8')
fo = open("论语-原文.txt","w")
flag = False
for line in fi:
if "【原文】" in line:
flag = True
continue
if flag:
if "【注释】" in line:
flag = False
continue
line = line.strip()
for i in range(1,23):
line = line.replace("({})".format(i),"")
fo.write(line+"\n")
fi.close()
fo.close()