目录
文章目录
背景
《论语》是儒家学派的经典著作之一,主要记录了孔子及其弟子的言行。网络上有很多《论语》文本版本。这里给出了一个版本,文件名称为“论语-网络版.txt”,其内容采用如下格式组织:
【原文】
1.11子曰:“父在,观其(1)志;父没,观其行(2);三年(3)无改于父之道(4),可谓孝矣。”
【注释】
(略)
【译文】
(略)
【评析】
(略)
该版本通过【原文】标记《论语》原文内容,采用【注释】、【译文】和【评析】标记对原文的注释、译文和评析。
问题一及其解答
问题
请编写程序,提取《论语》文档中所有原文内容,输出保存到“论语-提取版.txt”文件。输出文件格式要求:去掉文章中原文部分每行行首空格及如“1.11”等的数字标志,行尾无空格、无空行。参考格式如下(原文中括号及内部数字是对应源文件中注释项的标记):
子曰(1):“学(2)而时习(3)之,不亦说(4)乎?有朋(5)自远方来,不亦乐(6)乎?人不知(7),而不愠(8),不亦君子(9)乎?”
有子(1)曰:“其为人也孝弟(2),而好犯上者(3),鲜(4)矣;不好犯上,而好作乱者,未之有也(5)。君子务本(6),本立而道生(7)。孝弟也者,其为人之本与(8)?”
子曰:“巧言令色(1),鲜(2)仁矣。”
(略)
解答一
总程序框图
子程序1
子程序2
子程序3
程序代码
with open("论语-网络版.txt", "r", encoding = "UTF-8") as fi:
lines = fi.readlines()
# 1.去掉文章中原文部分每行行首空格,行尾无空格、无空行
# 并将修改后的字符串保存在列表ls中
ls = []
flag = 2 # 用整型变量作为标记
for line in lines:
# 定位【原文】在txt文档中的位置:
if line == " 【原文】\n":
flag = 0
elif line == " 【注释】\n" or line == " 【译文】\n" or line == " 【评析】\n":
flag = 1
else:
flag += 1
# 将【原文】下面的内容赋给列表ls:
if flag == 2:
if line !="\n":
ls.append(line.strip(" "))
# 2. 去掉文章中原文部分每行数字标志,并将修改后的字符串
# 保存内容至列表ls1
ls1 = []
for line in ls:
####### 将行首的数字全部转换为* #########
for i in range(25):
for j in range(25):
line = line.replace("{}·{}".format(i,j),"**")
for i in range(10):
line = line.replace("{}*".format(i),"")
for i in range(10):
line = line.replace("*{}".format(i),"")
#########################################
line = line.replace("*","") # 替换*为空字符
ls1.append(line)
## 3. 将列表ls1保存在文件中
with open("论语-提取版.txt", "w", encoding = "UTF-8") as fo:
fo.writelines(ls1)
程序解释
下面从程序的形态和功能、构造、特征和性质、关系四个方面来解释程序。
形态和功能:上述代码是一组由字符、符号等以离散形式表示的能够实现提取《论语》文本功能的明确的规则体系。
构造:程序代码共分为三大部分:利用第一部分代码可以去掉《论语》原文的行首空格、行尾回车和行尾空格,处理后的文本保存在列表中;利用第二部分代码可以进一步去掉《论语》原文中的数字标志,处理后的文本保存在列表中;利用第三部分代码将经过上述两步处理后的文本保存在文件中。
特征和性质:上述代码具有唯一确定性、标准化和可通用性、可扩充性与稳定性、便于识别和记忆、力求短小和格式统一以及容易修改等特点。
关系:代码和源程序的概念相同。源程序是指未经编译的,按照一定程序设计语言规范书写的可读文本文件,包括算法和数据结构。源程序加上说明文档可以构成软件。
解答二
解答方案二和方案一的不同点在于子程序1。在方案一中,通过整型变量定位【原文】内容,在方案二中,通过布尔变量定位【原文】内容。
总程序框图
子程序1
子程序2
子程序3
程序代码
with open("论语-网络版.txt", "r", encoding = "UTF-8") as fi:
lines = fi.readlines()
# 1.去掉文章中原文部分每行行首空格,行尾无空格、无空行
# 并将修改后的字符串保存在列表ls中
ls = []
flag = False # 用Boolean变量作为标记
for line in lines:
# 定位【原文】在txt文档中的位置
if "【" in line: #遇到【时,说明已经到了新的区域,写标记为False
flag = False
if "【原文】" in line: #遇到【原文】时,设置写标记为True
flag = True
continue
if flag == True:
ls.append(line.strip(" ")) # 去除字符串中的空格和回车
if line !="\n":
fo.writelines(line)
for element in ls:
ls.remove("") # 去除列表中的空字符串 ls.remove(x)将列表ls中出现的第一个元素x删除
# 2. 去掉文章中原文部分每行数字标志,并将修改后的字符串
# 保存内容至列表ls1
ls1 = []
for line in ls:
####### 将行首的数字全部转换为* #########
for i in range(10):
for j in range(10):
line = line.replace("{}·{}".format(i,j),"**")
for i in range(10):
line = line.replace("{}*".format(i),"")
for i in range(10):
line = line.replace("*{}".format(i),"")
#########################################
line = line.replace("*","") # 替换*为空字符
ls1.append(line)
## 3. 将列表ls1保存在文件中
with open("论语-提取版.txt", "w", encoding = "UTF-8") as fo:
fo.writelines(ls1)
解答三
总程序框图
子程序1
子程序2
子程序3
程序代码
with open("论语-网络版.txt", "r", encoding = "UTF-8") as fi:
lines = fi.readlines()
# 1.去掉文章中原文部分每行行首空格,行尾无空格、无空行
# 并将修改后的字符串保存在列表ls中
ls = []
flag = False # 用Boolean变量作为标记
for line in lines:
# 定位【原文】在txt文档中的位置
if "【" in line: #遇到【时,说明已经到了新的区域,写标记为False
flag = False
if "【原文】" in line: #遇到【原文】时,设置写标记为True
flag = True
continue
if flag == True:
if line !="\n":
line = line.strip(" ")
ls.append(line) # 去除字符串中的空格和回车
# 2. 去掉文章中原文部分每行数字标志,并将修改后的字符串
# 保存内容至列表ls1
ls1 = []
for line in ls:
####### 将行首的数字全部转换为* #########
for i in range(10):
for j in range(10):
line = line.replace("{}·{}".format(i,j),"**")
for i in range(10):
line = line.replace("{}*".format(i),"")
for i in range(10):
line = line.replace("*{}".format(i),"")
#########################################
line = line.replace("*","") # 替换*为空字符
ls1.append(line)
## 3. 将列表ls1保存在文件中
with open("论语-提取版.txt", "w", encoding = "UTF-8") as fo:
fo.writelines(ls1)
问题二及其解答
问题
请编写程序,在“论语-提取版.txt”基础上,进一步去掉每行文字中所有括号及其内部数字,保存为“论文-原文.txt”文件。参考格式如下:
子曰:“学而时习之,不亦说乎?有朋自远方来,不亦乐乎?人不知,而不愠,不亦君子乎?”
有子曰:“其为人也孝弟,而好犯上者,鲜矣;不好犯上,而好作乱者,未之有也。君子务本,本立而道生。孝弟也者,其为人之本与?”
子曰:巧言令色,鲜仁矣。”
(略)
本题暂不支持自动评分,print(“我已掌握”),即可得分
解答一
程序框图
程序代码
with open("论语-提取版.txt","r",encoding = "UTF-8") as fi:
lines = fi.readlines()
#############分别替换左括号、右括号和数字##########
ls = []
for line in lines:
line = line.replace("(","") #替换左括号
line = line.replace(")","") #替换右括号
for c in line:
if c.isnumeric():
line = line.replace(c,"") #替换数字
ls.append(line)
##############################################
with open("论文-原文.txt","w",encoding = "UTF-8") as fo:
fo.write(line)
解答二
程序框图
程序代码
with open("论语-提取版.txt","r",encoding = "UTF-8") as fi:
lines = fi.readlines()
###################方法二####################
#############先将括号以及括号里面的数字替换成*号,
########然后再将*替换成空字符串##########
ls = []
for line in lines:
for i in range(25):
line = line.replace("({})".format(i),"*") # 利用format确定指定格式的字符串
line = line.replace("*","")
ls.append(line)
############################################
with open("论文-原文.txt","w",encoding = "UTF-8") as fo:
fo.writelines(ls)
知识点总结
-
掌握if语句、if-else语句和if-elif-else语句的语法区别和使用方法。
-
掌握文件读写操作,包括常规的open函数,with…as…语句。
-
掌握字符串的操作:
3.1. 字符串的提取
学会利用标记(flag)字符(可以是boolean类型或者整型变量)查找特定的字符串。
3.2. 字符串中指定字符的替换
学会利用replace()函数替换字符串中的指定字符,注意replace()返回值是原字符串的副本。
3.3. 字符串中特定字符的删除(空格、回车)
学会利用strip()函数删除字符串中的指定字符,注意strip()返回值是原字符串的副本。
-
理解str方法isnumeric()的用法,如果字符串中所有字符均是数字,那么isnumeric()返回True,注意不要忘记参数括号“()”。
-
会利用format确定指定格式的字符串。