用Python摘抄《大道争锋》中的诗句

前言

随便记一下写这个程序的过程,对新学到的东西做个笔记。

一直很喜欢《大道争锋》这本小说,尤其是误道者文字间的古风韵味以及时不时来一首颇具仙风道骨的诗歌。于是在二刷之后有了将这些诗歌做个摘抄的想法,奈何《大道争锋》全文700万字,要再刷一次去摘抄诗句的工作量不小,所以我就有了用Python帮我摘抄的想法。

数据分析

首先,程序的判定非常死板,所以我们的原文资源一定要好,不要有什么奇奇怪怪的字符或者标点符号有问题。

之后我们观摩一下目标数据:诗句的特征。
在这里插入图片描述
在这里插入图片描述
我们机智地发现,所有诗句都是由书中人吟诵出来的,所以诗句都是由双引号括起来的。同时,诗句的字数都很工整,均为五个字五个字或者七个字七个字。

(本来还想加一个判断押韵,连pypinyin都装好了,但是押韵的判断并没有想象中的简单,而之前的判断条件对于小说文本来说已经足够严格,漏网之鱼很少,所以就没有加)

开始编程

打开文件

首先把文本文件打开,由于是中文,使用了UTF-8编码,所以不能直接打开,否则只能读出一堆乱码。

f=open('DDZF.txt','r',encoding='utf8')

其中,'DDZF.txt'是要打开的文件名称,'r'表示只读,encoding='utf8'则是文件对应的解码。

更多的读写模式指令详见下图:
在这里插入图片描述

筛选出所有人物对话

打开了文件之后,还需要把文件的内容读进来,因为整个文本对于计算机来说比较小,所以这里我选择了f.read()直接把所有文本读入,之后还会有f.readline()f.readlines()等文件读入函数。

主要就是判断引号括起来的部分,比较简单,用一个flag变量就解决了,要做笔记的主要是对汉字的判断:

def is_Chinese(ch):
    return '\u4e00'<=ch<='\u9fff'

至于符号的判断,Python实际有更简洁的写法,我用的则是Python版的C艹写法,在后面会有改进。

另外,为了方便判断,我将所有符号都替换为了'*',在最后输出的时候会重新还原。

代码:

#筛选出人物说的话,替换其中标点
fuhao=[',','。','?','!']
def is_fuhao(ch):
    for fh in fuhao:
        if ch==fh:
            return True
def is_Chinese(ch):
    return '\u4e00'<=ch<='\u9fff'
txt=[]
tmp=[]
flag=0
for ch in f.read():
    if ch=='“':
        flag=1
    if is_Chinese(ch) and flag==1:
        tmp.append(ch)
    if is_fuhao(ch) and flag==1:
        tmp.append('*')
    if ch=='”':
        flag=0
        txt.append("".join(tmp))
        tmp=[]
f.close()

存入的时候,我把tmp从列表转换为了字符串,用到的语句为"".join(),其中双引号括起来的部分为拼接字符串时,列表中各个元素之间的间隔符号,由于这里是中文拼接,不需要间隔,直接为空就行了。括号里的内容则是要转化的列表名称。

其实这是个小失误,应该直接把tmp以列表的形式appendtxt里,将它转化为字符串其实是多此一举了。

筛选出字数符合要求的句子

前面也说了,因为是正常的小说文本,用字数来筛选已经足够严格,我们只需要判断这些人物说的话里有没有五个字五个字一组或者七个字七个字一组的就已经足够把诗句筛选出来了。

类似的,用f=open('out.txt','w')打开/创建一个输出文件,然后用f.write()写入文件。这里就可以看到,为了将字符串里的'*'修正回来,我先转成了列表,修改完再转回字符串,就是因为之前的“多此一举”。

#处理出字数符合要求的句子
def reload(s):
    flag=0
    for i in range(len(s)):
        if s[i]=='*':
            if flag:
                s[i]='。'
            else :
                s[i]=','
            flag=1-flag
    return "".join(s)
f=open('out.txt','w')
for sen in txt:
    lenth=0
    poem=1
    cntfh=0
    for ch in sen:
        lenth+=1
        if ch=='*':
            cntfh+=1
            if lenth!=8 and lenth!=6:
                poem=0
                break
            lenth=0
    if poem and (cntfh==4 or cntfh==6 or cntfh==8):
        f.write(reload(list(sen)))
        f.write('\n')
f.close()

代码运行效果

他人以鼎劝莫争,我却以鼎淬元真。凡心妄演天机道,一番算计空付樽。
摩天弄云霭,食气吞仙斋。浩然朔罡风,决荡天门开。
足踏仙云游八荒,银河星汉渡险隘。若要问那长生果,有缘可来补天斋。
混沌辟生无贵贱,岂叫神人坐金殿。若得一口仙灵气,敢上九天争日月。
我本凡人磨岁寿,困拘庐中不知愁。忽闻仙人阁上坐,蓬莱山外寻天楼。
七星束阳袍,百炼火中烧。莫道形不伤,人劫最难逃。
长河奔流入海西,东来水分清浊气。漫渡急浪覆云履,脚踏罡斗握玄机。
法象竞日出,乾坤定宏图。今日脱劫去,飞身上天庐。
萤流举轻舞,星汉去寂心。横江照夜火,万里烛幽冥。
二十年来藏剑锋,忽起长歌神鬼惊。大道苍茫斩歧路,笑看沧海听雷音。
百炼功成道家果,乾坤自在手中握。日月轮转星流火,瞒天夺寿劫法螺。万浪千礁齐踏破,长生无悔笑蹉跎。
清风扶我上九天,此去浮云织彩间。由来逍遥是神仙,一梦回首已千年。
恩师飞升前,曾让我带话与你。说今时不同往日,能放手便放手吧。
阴阳两气参性命,精元藏胸演五行。神意巍然攀山岭,擎天柱里炼罡英。九霄云中鸣剑音,扫荡妖氛涤气净。心有冲天龙虎意,倒海翻江还天青。
双月映卿水,倾城何独怨。对影如不见,画镜照寂怜。
花愁岁月催色残,谁人听怨道哀怜。漫起香阵蔽星汉,罗带抟风改天颜。
灵珠牝牡化界方,一十六法俱收藏。采撷清气度真法,反演星斗会天象。
杀便杀了吧,把尸体留着。峨山派若有人来,交给他们就是了。
乾坤两分气化真,五龙五行炼法身。身若天柱立昆仑,心盘海山镇劫尘。今朝神屋诛天妖,他日天外斩鬼神。
今日乘风去,舍身了尘扰。明朝得金丸,再入神仙道。
龙头于北饮苍澜,龙尾在南戏寒山。乾坤一动风云变,造化无情天道玄。
龙渊倒悬潮升烟,大滔横流三千年。唤得清澜洗日月,长空一相水齐天。
不堕轮回入大千,心传一道在人间。愿起一剑杀万劫,无情换作有情天。
驱鬼惑人为下道,呼风唤雨为上道。养生调元为小道,长生逍遥为大道。
此身入道五百载,志气长存星斗移。当啸长歌舒胸臆,云霄一气动天地。
少年轻负剑,玄崖寻仙楼。一朝得闻道,畅然天地游。平生舒快意,狂笔写春秋。长生非我愿,只解心中忧。
仰吞初阳火,炼得天魔身。倒卷地灵气,相成阴中神。
一播阳火转朱丹,点破玄冥赤火鸾。红尘解炼去凡身,金阳吐灿开霄汉。
霍真人成就法相,实为我溟沧兴事。以恩师之见,那法相当作何称。
守得灵心见月明,四海潮冲蜕鳍鳞。神通本是石人授,玉磬敲动龙门音。
十万心界量玄关,一剑横光丈千秋。只手拨得天惊弦,搅彻周天乱星汉。
人间本来多磨难,百砺心劫方圆满。采得一风生玄翼,拂去尘身踏仙关。
独上万山巅,孤扣大道钟。千波留不住,淡看云匆匆。衣角拭顽心,尘落显真容。任他风雷雨,鹤徊九云中。
方才我已试过了,这岛上煞气极重。会消磨灵机,可无法吐纳调息。
本是草莽一生灵,石人解玄方辨情。身散气化心未休,一脉当传万载名。
虚空落神精,化气散微尘。功成六转境,百劫不磨身。嘘呵天地气,一力定乾坤。
小舟渡幼鸿,扶翼入云岸。寒山乌云暖,执剑掌幽谭。苍海青天外,鸣声阵阵来。蓦然轻风雨,云破雁飞还。
举手撑天岳,足量九地宽。含烟定四海,吐气动万山。
青桐山下日月藏,斩却前身渡玄航。龙血炼气万化生,神目一开转阴阳。
十二重关载道传,紫气胎里种玄元。摘落真花见根果,拭去凡尘天外仙。
在言语之前,可立下法契。你不放心我,我亦不会放心你。
一气鸿濛演乾坤,问道诸寰斩二身。万法不沾神自定,与天同寿洞玄真。
元海凭舟渡灵真,造化为炉炼法身。一气贯通诸天界,乾坤同和演玄神。
拂清宙黯见神空,始知两界此源同。力撼周宇破天壁,终从一元道法宏。
玄波瑶台服灵种,凝光映霄见明空。甘露洗玉含清丹,天河流裳仙影从。
念成虚空照心景,意作金炉筑玄经。一言可定天地法,身举清光兴万灵。
浑中鉴真开神目,气意显冲散龙图。身去诸天问玄法,从此不言大道孤。
正气浩荡人法宏,齐诵道章九洲同。清阳悬空临绝顶,明照天下万景从。
我听你方才言论,似论及栖霞仙子。观你们行途匆匆,又是要往哪里去。
会炼诸空渡世人,名称太上大道尊。莫道青天无始终,造化门中神常存。
昔闻上法曾授命,才得天火炼真金。长歌一曲问世情,只斩凡身不斩心。
两世持存含灵珠,万般磨炼后人书。洗去心垢抛旧身,天人自此无殊途。
避绝万劫心在前,虚空常渡化未先。往来过去皆落意,神横诸世气倾天。
万劫渡磨入世身,诸常洗却旧顽真。道本无名神自主,莲台座上又一人。
无心亦无定,无常亦无名。神空一意转,不变是顽精。
尘心不觉难自悟,辟开人间通天路。惟愿众生皆长生,穹霄万古执道主。
万顷仙波去,千湖返灵光。玄机天地生,乾坤书道章。

共筛选出57首诗,其中6只巧合而成的漏网之鱼,准确率有90%,由于数据量较小,可以采用人工剔除的办法,得到最终结果:

他人以鼎劝莫争,我却以鼎淬元真。凡心妄演天机道,一番算计空付樽。
摩天弄云霭,食气吞仙斋。浩然朔罡风,决荡天门开。
足踏仙云游八荒,银河星汉渡险隘。若要问那长生果,有缘可来补天斋。
混沌辟生无贵贱,岂叫神人坐金殿。若得一口仙灵气,敢上九天争日月。
我本凡人磨岁寿,困拘庐中不知愁。忽闻仙人阁上坐,蓬莱山外寻天楼。
七星束阳袍,百炼火中烧。莫道形不伤,人劫最难逃。
长河奔流入海西,东来水分清浊气。漫渡急浪覆云履,脚踏罡斗握玄机。
法象竞日出,乾坤定宏图。今日脱劫去,飞身上天庐。
萤流举轻舞,星汉去寂心。横江照夜火,万里烛幽冥。
二十年来藏剑锋,忽起长歌神鬼惊。大道苍茫斩歧路,笑看沧海听雷音。
百炼功成道家果,乾坤自在手中握。日月轮转星流火,瞒天夺寿劫法螺。万浪千礁齐踏破,长生无悔笑蹉跎。
清风扶我上九天,此去浮云织彩间。由来逍遥是神仙,一梦回首已千年。
阴阳两气参性命,精元藏胸演五行。神意巍然攀山岭,擎天柱里炼罡英。九霄云中鸣剑音,扫荡妖氛涤气净。心有冲天龙虎意,倒海翻江还天青。
双月映卿水,倾城何独怨。对影如不见,画镜照寂怜。
花愁岁月催色残,谁人听怨道哀怜。漫起香阵蔽星汉,罗带抟风改天颜。
灵珠牝牡化界方,一十六法俱收藏。采撷清气度真法,反演星斗会天象。
乾坤两分气化真,五龙五行炼法身。身若天柱立昆仑,心盘海山镇劫尘。今朝神屋诛天妖,他日天外斩鬼神。
今日乘风去,舍身了尘扰。明朝得金丸,再入神仙道。
龙头于北饮苍澜,龙尾在南戏寒山。乾坤一动风云变,造化无情天道玄。
龙渊倒悬潮升烟,大滔横流三千年。唤得清澜洗日月,长空一相水齐天。
不堕轮回入大千,心传一道在人间。愿起一剑杀万劫,无情换作有情天。
驱鬼惑人为下道,呼风唤雨为上道。养生调元为小道,长生逍遥为大道。
此身入道五百载,志气长存星斗移。当啸长歌舒胸臆,云霄一气动天地。
少年轻负剑,玄崖寻仙楼。一朝得闻道,畅然天地游。平生舒快意,狂笔写春秋。长生非我愿,只解心中忧。
仰吞初阳火,炼得天魔身。倒卷地灵气,相成阴中神。
一播阳火转朱丹,点破玄冥赤火鸾。红尘解炼去凡身,金阳吐灿开霄汉。
守得灵心见月明,四海潮冲蜕鳍鳞。神通本是石人授,玉磬敲动龙门音。
十万心界量玄关,一剑横光丈千秋。只手拨得天惊弦,搅彻周天乱星汉。
人间本来多磨难,百砺心劫方圆满。采得一风生玄翼,拂去尘身踏仙关。
独上万山巅,孤扣大道钟。千波留不住,淡看云匆匆。衣角拭顽心,尘落显真容。任他风雷雨,鹤徊九云中。
本是草莽一生灵,石人解玄方辨情。身散气化心未休,一脉当传万载名。
虚空落神精,化气散微尘。功成六转境,百劫不磨身。嘘呵天地气,一力定乾坤。
小舟渡幼鸿,扶翼入云岸。寒山乌云暖,执剑掌幽谭。苍海青天外,鸣声阵阵来。蓦然轻风雨,云破雁飞还。
举手撑天岳,足量九地宽。含烟定四海,吐气动万山。
青桐山下日月藏,斩却前身渡玄航。龙血炼气万化生,神目一开转阴阳。
十二重关载道传,紫气胎里种玄元。摘落真花见根果,拭去凡尘天外仙。
一气鸿濛演乾坤,问道诸寰斩二身。万法不沾神自定,与天同寿洞玄真。
元海凭舟渡灵真,造化为炉炼法身。一气贯通诸天界,乾坤同和演玄神。
拂清宙黯见神空,始知两界此源同。力撼周宇破天壁,终从一元道法宏。
玄波瑶台服灵种,凝光映霄见明空。甘露洗玉含清丹,天河流裳仙影从。
念成虚空照心景,意作金炉筑玄经。一言可定天地法,身举清光兴万灵。
浑中鉴真开神目,气意显冲散龙图。身去诸天问玄法,从此不言大道孤。
正气浩荡人法宏,齐诵道章九洲同。清阳悬空临绝顶,明照天下万景从。
会炼诸空渡世人,名称太上大道尊。莫道青天无始终,造化门中神常存。
昔闻上法曾授命,才得天火炼真金。长歌一曲问世情,只斩凡身不斩心。
两世持存含灵珠,万般磨炼后人书。洗去心垢抛旧身,天人自此无殊途。
避绝万劫心在前,虚空常渡化未先。往来过去皆落意,神横诸世气倾天。
万劫渡磨入世身,诸常洗却旧顽真。道本无名神自主,莲台座上又一人。
无心亦无定,无常亦无名。神空一意转,不变是顽精。
尘心不觉难自悟,辟开人间通天路。惟愿众生皆长生,穹霄万古执道主。
万顷仙波去,千湖返灵光。玄机天地生,乾坤书道章。

这或许是全网最全《大道争锋》诗集?[doge]

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShadyPi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值