《论语》是儒家学派的经典著作之一,主要记录了孔子及其弟子的言行。网络上有很多《论语》文本版本。这里给出了一个版本,文件名称为“论语一网络版.txt”,其内容采用如下格式组织: 【原文】 1.11子曰:“父在,观其(1)志;父没,观其行(2);三年(3)无改

admin2019-08-30  47

问题 《论语》是儒家学派的经典著作之一,主要记录了孔子及其弟子的言行。网络上有很多《论语》文本版本。这里给出了一个版本,文件名称为“论语一网络版.txt”,其内容采用如下格式组织:
【原文】
1.11子曰:“父在,观其(1)志;父没,观其行(2);三年(3)无改于父之道(4),可谓孝矣。”
【注释】
(略)
【译文】
(略)
【评析】
(略)
该版本通过【原文】标记《论语》原文内容,采用【注释】、【译文】和【评析】标记对原文的注释、译文和评析。
问题1:请编写程序,提取《论语》文档中所有原文内容,输出保存到“论语一提取版.txt”文件。输出文件格式要求:去掉文章中原文部分每行行首空格及如“1.11”等的数字标志,行尾无空格、无空行。参考格式如下(原文中括号及内部数字是对应源文件中注释项的标记:
子曰(1):“学(2)而时习(3)之,不亦说(4)乎?有朋(5)自远方来,不亦乐(6)乎?人不知(7),而不愠(8),不亦君子(9)乎?”
有子(1)曰:“其为人也孝弟(2),而好犯上者(3),鲜(4)矣;不好犯上,而好作乱者,未之有也(5)。君子务本(6),本立而道生(7)。孝弟也者,其为人之本与(8)?”
子曰:“巧言令色(1),鲜(2)仁矣。”
(略)
问题2:请编写程序,在“论语-提取版.txt”基础上,进一步去掉每行文字中所有括号及其内部数字,保存为“论文一原文.txt”文件。参考格式如下:
子曰:“学而时习之,不亦说乎?有朋自远方来,不亦乐乎?人不知,而不愠,不亦君子乎?”有子曰:“其为人也孝弟,而好犯上者,鲜矣;不好犯上,而好作乱者,未之有也。君子务本,本立而道生。孝弟也者,其为人之本与?”
子曰:巧言令色,鲜仁矣。”
(略)

选项

答案问题1答案如下: fi=open(’’论语一网络版.txt’’,’’r’’,encoding=’’uff-8’’) fo=open(’’论语一提取版,txt’’,’’w’’) wflag=False #写标记 for line in fi: if’’【’’in line: #遇到【时,说明已经到了新的区域,写标记置否 wflag=False if’’【原文】’’ in line: #遇到【原文】时,设置写标记为True wflag=True continue if wflag==True: #根据写标记将当前行内容写入新的文件 for i in range(0,25): for j in range(0,25): line=line.replace(’’{}.{}’’.format(i,j),’’**’’) for i in range(0,10): line=line.replace(’’*{}.format(i),’’’’) for i in range(0,10): line=line.replace(’’{},*’’.format(i),’’’’) line=line.replace(’’.’’,’’’’) fo.write(line) fi.close() fo.close() 问题2答案如下: fi=open(’’论语一提取版.txt’’,’’r’’) fo=open(’’论语一原文.txt’’,’’w’’) for line in fi: for i in range(1,23): line=line.replace(’’({})’’.format(i),’’’’) fo.write(line) fi.close() fo.close()

解析 这是一个综合应用题,考核对规则文本文件的处理能力。
问题1:从网络下载的“论语一网络版.txt”中粗略提取原文,形成“论语一提取版.cxt”。读写文件分别采用open()函数的’’r’’和’’w’’模式。
    在读人文件时,可以增加参数encoding=’’utf-8’’,指定程序采用utf-8编码打开文件。文件编码过于复杂,在等级考试中并未涉及,这里,建议对编码的理解使用如下两条规则:第一,如果一个文本文件从网络获得,增加encoding参数,指定编码方式打开;第二,如果Python程序生成了一个文件,并再次打开,则不需要指定encoding参数。
    问题1提取【原文】后面区域的内容,与单行提取不同,区域提取文本需要处理若干行,为此,可以考虑建立一个写标记,即wflag参数。
当遇到“【原文】”字样时,将wflag标记设为True,后续读入该区域其他行时,按照【原文】对应区域块的文本进行处理。当遇到其他【注释】、【译文】和【评析】等标记时,则将wflag设为False,表示程序已经离开了【原文】区域。维护上述标记,可以将【原文】或其他标志出现作为条件,维护wflag变量值。进一步,根据wflag变量值,确定是否将文本内容输出到新的文件中。
问题1参考代码如下,代码中增加注释用于说明。
fi=open(’’论语一网络版.txt’’,’’r’’,encoding=’’utf-8’’)
fo=open(’’论语一提取版.txt’’,’’w’’)
wflag=False    #写标记
for line in fi:
if’’【’’in line:    #遇到【时,说明已经到了新的区域,写标记置否
wflag=False
if’’【原文】’’in line:    #遇到【原文】时,设置写标记为True
wflag=True
continue
if wflag==True:    #根据写标记将当前行内容写入新的文件
for i in range(0,25):
for j in range(0,25):
line=line.replace(’’{}.{}’’.format(i,j),’’**’’)
for i in range(0,10):
line=line.replace(’’*{}’’.format(i),’’’’)
for i in range(0,10):
line=line.replace(’’{}*’’.format(i),’’’’)
line=line.replace(’’*’’,’’’’)
fo.write(1ine)
fi.close()
fo.closef)
问题2在问题1基础上,进一步对提取后原文的内容进行清理,去掉其中出现的“(数字)”这种形式。问题1提取后的文件片段和对应问题2的清理目标如下。
子曰(1):“学(2)而时习(3)之,不亦说(4)乎?有朋(5)自远方来,不亦乐(6)乎?人不知(7),而不愠(8),不亦君子(9)乎?”
子曰:“学而时习之,不亦说乎?有朋自远方来,不亦乐乎?人不知,而不愠,不亦君子乎?”对问题1提取后的文件分析可知,其中出现“(1)”到“(22)”共22种可能的字符串。
一个简单思路是逐一替换上述出现的字符串为空字符串,这种替换相当于删除上述字符串。这可以采用.replace()函数进行。问题2的参考代码及关键代码注释如下。
fi=open(’’论语一提取版.txt’’,’’r’’)
fo=open(’’论语一原文.txt’’,’’w’’)
for line in fi:  #逐行遍历
for i in range(1,23):#产生1到22数字
line=line.replace(’’({})”.format(i),’’’’)#构造(i)并替换
fo.write(line)
fi.close()
fo.close()
转载请注明原文地址:https://jikaoti.com/ti/jI50FFFM
0

最新回复(0)