【python计算机⼆级】python论语⽂本提纯-计算机⼆级操作
在刷计算机⼆级操作题题库时候,⽆论是未来教育、python123以及其他平台资源,想必⼤家都会遇到最后⼀道操作题是关于论语⽂本提纯的问题。初次看到的这种题⽬的⼩⽩,眼⾥就是这是什么⿁呀,看不懂呀,怎么嵌套了这么多的循环
part 1
预备知识 replace使⽤
s1 = "1·1⼦⽈(1):“学(2)⽽时习(3)之,不亦说(4)乎?有朋(5)⾃远⽅来,不亦乐(6)乎?⼈不知(7),⽽不愠(8),不亦君⼦(9)乎?”"
place("1·1","")) #⽬的是去掉前⾯的数字标号
print(s1)  #replace⽅法不改变原字符串
place("1·1","")
print(s1)  #需要将replace后的字符重新赋给原字符串,完成内容的修改
==>> ⼦⽈(1):“学(2)⽽时习(3)之,不亦说(4)乎?有朋(5)⾃远⽅来,不亦乐(6)乎?⼈不知(7),⽽不愠(8),不亦君⼦(9)乎?”
==>> 1·1⼦⽈(1):“学(2)⽽时习(3)之,不亦说(4)乎?有朋(5)⾃远⽅来,不亦乐(6)乎?⼈不知(7),⽽不愠(8),不亦君⼦(9)乎?”
==>> ⼦⽈(1):“学(2)⽽时习(3)之,不亦说(4)乎?有朋(5)⾃远⽅来,不亦乐(6)乎?⼈不知(7),⽽不愠(8),不亦君⼦(9)乎?”
第⼀步⽂件打开及内容读取
fi = open("C:/Users/86177/Desktop/论语-⽹络版.txt","r") #选择⽂件放置的位置,注意位置符。
==>> UnicodeDecodeError: 'gbk' codec can't decode byte 0xae in position 4: illegal multibyte sequence
出现此类错误,使⽤“utf-8”编码⼀般就可以解决。
fi = open("C:/Users/86177/Desktop/论语-⽹络版.txt","r",encoding = "utf-8") #⼀般添加编码utf-8再读⼊即可
==>> '\ufeff论语全篇学⽽篇第⼀\n\n  【本篇引语】\n\n  《学⽽》是《论语》第⼀篇的篇名。
《论语》中各篇⼀般都是以第⼀章的前⼆三个字作为该篇的篇名。《学⽽》⼀篇包括16章,内容涉及
诸多⽅⾯。其中重点是“吾⽇三省吾⾝”;“节⽤⽽爱⼈,使民以时”;“礼之⽤,和为贵”以及仁、孝、
信等道德范畴。\n\n  【原⽂】\n\n  1·1⼦⽈(1):“学(2)⽽时习(3)之,不亦说(4)乎?有朋(5)⾃
远⽅来,不亦乐(6)乎?⼈不知(7),⽽不愠(8),不亦君⼦(9)乎?”\n\n  【注释】\n\n  (1)⼦
:中国古代对于有地位、有学问的男⼦的尊称,有时也泛称男⼦。《论语》书中“⼦⽈”的⼦,都是指孔⼦⽽⾔
(2)学:孔⼦在这⾥所讲的“学”,主要是指学习西周的礼、乐、诗、书等传统⽂化典籍。\n\n
(3)时习:在周秦时代,“时”字⽤作副词,意为“在⼀定的时候”或者“在适当的时候”。但朱熹在《论语集注》
⼀书中把“时”解释为“时常”。“习”,指演习礼、乐;复习诗、书。也含有温习、实习、练习的意思。\n\n
(4)说:⾳yuè,同悦,愉快、⾼兴的意思。\n\n  (5)有朋:⼀本作“友朋”。旧注说,“同门⽈朋”,即
同在⼀位⽼师'
第⼆步将原⽂写⼊到⽬标⽂件夹
对⽂本进⾏分析可知:要求写⼊的内容都在“【原⽂】”后边,所以在读取时候遇到“【原⽂】”标志即可读⼊之后的内容。⽽对
于“【】”之中其他的内容,过滤掉即可。
fi = open("C:/Users/86177/Desktop/论语-⽹络版.txt","r",encoding = "utf-8")
fo = open("C:/Users/86177/Desktop/论语-⽹络版1.txt","w")
flag = False                                    #设置标记
for line in fi:
if "【" in line:
flag = False                            #过滤掉其他【】中不需要的信息
if "【原⽂】" in line:
flag = True
continue
if flag == True:
fo.write(line)
fi.close()
fo.close()
第三步去掉每句话前⾯的编号
#先举个栗⼦,将下⾯四句话前⾯的数字编号去掉
s2 = "1·1⼦⽈(1):“学(2)⽽时习(3)之,不亦说(4)乎?有朋(5)⾃远⽅来,不亦乐(6)乎?⼈不知(7),⽽不愠(8),不亦君⼦(9)乎?”\
1·2有⼦(1)⽈:“其为⼈也孝弟(2),⽽好犯上者(3),鲜(4)矣;不好犯上,⽽好作乱者,未之有也(5)。君⼦务本(6),本⽴⽽道⽣(7)。孝弟也者,其为⼈之本与(8)?      9·14⼦欲居九夷(1)。或⽈:“陋(2),如之何?”⼦⽈:“君⼦居之,何陋之有?”\
11·12季路问事⿁神。⼦⽈:“未能事⼈,焉能事⿁?”⽈:“敢问死。”⽈:“未知⽣,焉知死?”"
#观察⼀下结构可以发现最前⾯都是由“数字·数字”组成的,因此可以想到下⾯操作
for i in range(12):                                        #左侧的最⼤值为11,括号内取12
for j in range(13):                                    #右侧最⼤值为13,括号内取13
s2 = s2.replace("{}·{}".format(i,j),"")          #⼀步将前⾯数字替换成空字符
print(s2)
==>> '⼦⽈(1):“学(2)⽽时习(3)之,不亦说(4)乎?有朋(5)⾃远⽅来,不亦乐(6)乎?⼈不知(7),⽽不愠
(8),不亦君⼦(9)乎?”      有⼦(1)⽈:“其为⼈也孝弟(2),⽽好犯上者(3),鲜(4)矣;不好犯上,⽽好作
乱者,未之有也(5)。君⼦务本(6),本⽴⽽道⽣(7)。孝弟也者,其为⼈之本与(8)?”      4⼦欲居九夷(1)。
或⽈:“陋(2),如之何?”⼦⽈:“君⼦居之,何陋之有?”      12季路问事⿁神。⼦⽈:“未能事⼈,焉能
⿁?”⽈:“敢问死。”⽈:“未知⽣,焉知死?”'
结果呢  ⼀脸问号!!!  这怎么前⾯还有数字,按理说不是全变成  “空”  字符了吗
为了更直观地展⽰,将 “空” 字符换成 “*” 字符,然后在进⾏同样的操作,看看是不是发现了什么
s2 = "1·1⼦⽈(1):“学(2)⽽时习(3)之,不亦说(4)乎?有朋(5)⾃远⽅来,不亦乐(6)乎?⼈不知(7),⽽不愠(8),不亦君⼦(9)乎?”\
1·2有⼦(1)⽈:“其为⼈也孝弟(2),⽽好犯上者(3),鲜(4)矣;不好犯上,⽽好作乱者,未之有也(5)。君⼦务本(6),本⽴⽽道⽣(7)。孝弟也者,其为⼈之本与(8)?      9·14⼦欲居九夷(1)。或⽈:“陋(2),如之何?”⼦⽈:“君⼦居之,何陋之有?”\
11·12季路问事⿁神。⼦⽈:“未能事⼈,焉能事⿁?”⽈:“敢问死。”⽈:“未知⽣,焉知死?”"
for i in range(12):
for j in range(13):
s2 = s2.replace("{}·{}".format(i,j),"**")
print(s2)
==>> '**⼦⽈(1):“学(2)⽽时习(3)之,不亦说(4)乎?有朋(5)⾃远⽅来,不亦乐(6)乎?⼈不知(7),⽽不愠
(8),不亦君⼦(9)乎?”      **有⼦(1)⽈:“其为⼈也孝弟(2),⽽好犯上者(3),鲜(4)矣;不好犯上,⽽好
作乱者,未之有也(5)。君⼦务本(6),本⽴⽽道⽣(7)。孝弟也者,其为⼈之本与(8)?”      **4⼦欲居九夷
(1)。或⽈:“陋(2),如之何?”⼦⽈:“君⼦居之,何陋之有?”      1**2季路问事⿁神。⼦⽈:“未能事⼈,
焉能事⿁?”⽈:“敢问死。”⽈:“未知⽣,焉知死?”'
是不是最终发现,即使你遍历循环的值超过10,甚⾄都到12了,但是最后还是只占据了⼀个位置,显⽰⼀个 “*”。故:最终只是替
换了⼀个占位符⽽已,所以上述代码在遍历循环时候只要输⼊10即可。
for i in range(10):                                  #由上可知,⼀个数字只形成⼀个占位符,可以遍历0-9(包括0和9),也就是输⼊10
s2 = s2.replace("*{}".format(i),"**")            #将右侧的数字变成“*”
for i in range(10):
s2 = s2.replace("{}*".format(i),"**")            #将左侧的数字变成“*”
print(s2)
==>> '**⼦⽈(1):“学(2)⽽时习(3)之,不亦说(4)乎?有朋(5)⾃远⽅来,不亦乐(6)乎?⼈不知(7),⽽不愠
(8),不亦君⼦(9)乎?”      **有⼦(1)⽈:“其为⼈也孝弟(2),⽽好犯上者(3),鲜(4)矣;不好犯上,⽽好
作乱者,未之有也(5)。君⼦务本(6),本⽴⽽道⽣(7)。孝弟也者,其为⼈之本与(8)?”      ***⼦欲居九夷
(1)。或⽈:“陋(2),如之何?”⼦⽈:“君⼦居之,何陋之有?”      ****季路问事⿁神。⼦⽈:“未能事⼈,
焉能事⿁?”⽈:“敢问死。”⽈:“未知⽣,焉知死?”'
此时我们已经完成了前⾯数字标号的全部替换,最后⼀步直接将这些 “*” 变成 “空” 字符即可。
s2 = s2.replace("*","")                              #最后完成“*”字符的去除
print(s2)
==>> '⼦⽈(1):“学(2)⽽时习(3)之,不亦说(4)乎?有朋(5)⾃远⽅来,不亦乐(6)乎?⼈不知(7),⽽不愠
(8),不亦君⼦(9)乎?”      有⼦(1)⽈:“其为⼈也孝弟(2),⽽好犯上者(3),鲜(4)矣;不好犯上,⽽好作
乱者,未之有也(5)。君⼦务本(6),本⽴⽽道⽣(7)。孝弟也者,其为⼈之本与(8)?”      ⼦欲居九夷(1)。或
⽈:“陋(2),如之何?”⼦⽈:“君⼦居之,何陋之有?”      季路问事⿁神。⼦⽈:“未能事⼈,焉能事⿁?”
⽈:“敢问死。”⽈:“未知⽣,焉知死?”'
第四步将内容写⼊⽬标⽂件
此处只是保证操作步骤的完整,进⾏⽰意,具体的原⽂内容写⼊到⽬标⽂件可以参考第⼆步
fo.write(s2)  #此处只是为了展⽰步骤的完整性。具体的看下⾯的完整代码
第五步代码汇总
#完整代码如下
fi = open("C:/Users/86177/Desktop/论语-⽹络版.txt","r",encoding = "utf-8")
fo = open("C:/Users/86177/Desktop/论语-⽹络版1.txt","w")
flag = False
for line in fi:
if "【" in line:
flag = False
if "【原⽂】" in line:
flag = True
continue
if flag == True:
for i in range(10):
for j in range(10):
line = place("{}·{}".format(i,j),"**")
for i in range(10):
line = place("{}*".format(i),"")
for i in range(10):
line = place("*{}".format(i),"")
line = place("*","")
fo.write(line.lstrip())                    #实现⽬标格式输出,去掉左侧不必要的符号
fi.close()
fo.close()
part 2
有了part 1的梳理之后,part 2中只需要将“(数字)”看做⼀个整体进⾏替换即可。代码如下:
fi = open("C:/Users/86177/Desktop/论语-⽹络版1.txt", "r")
fo = open("C:/Users/86177/Desktop/论语-原⽂.txt", "w")
for line in fi:
for i in range(50): #数字要根据⽂本中的标志最⼤值设定,论语中语录⽐较简单,标记较少,为了确保不漏掉可以稍微设置⼤⼀些        place("({})".format(i), "") #构造(i)并替换
fo.write(line)
python怎么读取txt
fi.close()
fo.close()
附:
part2 论语提纯原⽂part1 论语-⽹络版1

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。