Python二级综合应用题:《论语》

目录

一、题干

二、问题1的解答

1. 官方给出的解法

2. 个人优化版

3. 正则表达式解法

二、问题2的解答

1.官方解法:用replace来替换

2. 个人解法:用re.sub()来替换

四、注意事项


一、题干

附件中有 2 个 Python 源文件和 3 个文本文件,分别对应两个问题,请参考编程模板的py文件,修改其中代码,实现以下功能: 《论语》是儒家学派的经典著作之一,主要记录了孔子及其弟子言行。这里给出了一个网络版本的《论语》,文件名称为“论语.txt”,其内容采用逐句“原文”与逐句“注释”相结合的形式组织,通过【原文】标记《论语》原文内容,通过【注释】标记《论语》注释内容,具体文件格式框架请参考“论语.txt”文件。(本题共计2问,本地回答第一问)‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

问题1:在PY301-1.py文件中修改代码,提取“论语.txt”文件中的原文内容,输出保存到考生文件夹下,文件名为“论语-原文.txt”。具体要求:仅保留“论语.txt”文件中所有【原文】标签下面的内容,不保留标签,并去掉每行行首空格及行尾空格,无空行。原文小括号及内部数字是源文件中注释项的标记,请保留。示例输出文件格式请参考“论语-原文-输出示例.txt”文件。注意:示例输出文件仅帮助了解输出格式,不作它用。‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

问题2:在PY301-2.py文件中修改代码,对“论语-原文.txt”或“论语.txt”文件进一步提纯,去掉每行文字中所有小括号及内部数字,保存为“论文-提纯原文.txt”文件。示例输出文件格式请参考“论语-提纯原文-输出示例.txt”文件。注意:示例输出文件仅帮助了解输出格式,不作它用。‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬

提示:建议使用Python集成开发环境IDLE编写、调试及验证程序

二、问题1的解答

1. 官方给出的解法

问题1提取【原文】后面区域的内容,与单行提取不同,区域提取文本需要处理若干行,为此,需建立一个标记即a参数。当遇到"【原文】"字样时,将a标记为1,后续读入该区域其他行时,按照【原文】对应区域块的文本进行处理。当遇到【注释】标记时,则将a标记为0,表示程序已离开了【原文】区域。根据a变量值,确定是否将文本内容输出到新的文件中。

# -*- coding:utf-8 -*-
'''
This is a python123.io file.
'''
fi = open("论语.txt", "r")
fo = open("论语-原文.txt", "w")
a=0
for line in fi:
    if a==1 and line.count("【注释】")==0 and line.count("【原文】")==0:
        line = line.strip(" \n")
        if line.strip():#判断line是否为空串
            fo.write('{}\n'.format(line))
    if line.count("【原文】")>0:
        a=1
    if line.count("【注释】")>0:
        a=0
fi.close()
fo.close()

2. 个人优化版

用not in 来替换line.count(),用line.strip()=="【原文】"来替换line.count("【原文】")>0,优化后版本如下:

fi = open("论语.txt", "r",encoding="utf-8")
fo = open("论语-原文.txt", "w")
flag = 0
for line in fi:
    if flag == 1 and "【原文】" not in line and "【注释】" not in line :
        line = line.strip(" \n")
         if line.strip():
              fo.write(line.strip()+"\n")
    if line.strip() == "【原文】":
        flag = 1
    if line.strip() == "【注释】":
        flag = 0
fi.close()
fo.close()

3. 正则表达式解法

我们用正则表达式中的re.findall()来查找【原文】和【注释】之间的内容,然后再格式化后输出,代码如下:

import re
with open("论语.txt", "r",encoding="utf-8") as fi, open("论语-原文.txt", "w",encoding="utf-8") as f:
    text = re.findall("(原文】)(.*?)(【)",fi.read(),re.S)
    for sen in text:
        lst = list(sen[1:-1])
        for elm in lst:
            f.write(elm.strip()+"\n")

二、问题2的解答

要求是去除括号和数字,相比上一题比较简单

1.官方解法:用replace来替换

fi = open("论语-原文.txt",'r')
fo = open("论语-提纯原文.txt",'w')
for line in fi:
    for k in range(100):
        line=line.replace('(' + str(k) + ')', '')
    fo.write(line)
fi.close()
fo.close()

2. 个人解法:用re.sub()来替换

直接用re.sub(pattern,replacement,string)来把带括号的数字替换为空,代码如下:

import re
fi = open("论语-原文.txt",'r',encoding="utf-8")
fo = open("论语-提纯原文.txt",'w',encoding="utf-8")
text = re.sub("\(\d+\)","",fi.read())
fi.close()
fo.close()

四、注意事项

  1. 用正则替换较为简单,而且re是内置的模块,不需要额外安装。
  2. 在网上做题时可以不用添加encoding = "utf-8"这个参数,但是在考试时必须要用。
  3. 用with open()的方式来打开文件更方便一些。定义句柄的方法也可以,但是一定要注意最后要关闭。

你可能感兴趣的:(python二级,python,开发语言)