python提取文件中某个区域的内容

1. 问题描述:

考生文件夹下存在2个Python源文件和3个文本文件,分别对应两个问题,请按照文件内说明修改代码,实现以下功能:
《论语》是儒家学派的经典著作之一,主要记录了孔子及其弟子言行。这里给出了一个网络版本的《论语》,文件名称为"论语.txt",其内容采用逐句"原文"与逐句"注释"相结合的形式组织,通过【原文】标记《论语》原文内容,通过【注释】标记《论语》注释内容,其体文件格式框架请参考“论语txt“文件。
问题1(10分):在PY301-1.py文件中修改代码,提取“论语.txt“文件中的原文内容,输出保存到考生文件夹下,文件名为“论语-原文txt。具体要求:仅保留"论语.txt文件"中所有【原文】标签下面的内容,不保留标签,并去掉每行行首空格及行尾空格,无空行。原文小括号及内部数字是源文件中注释项的标记,请保留。示例输出文件格式请参考"论语-原文-输出示例.txt"文件。注意:示例输出文件帮助考生了解输出格式,不作它用.
问题2(10分):在PY301-2.py文件中修改代码,对"论语-原文txt"或"论语-txt"文件进一步提纯,去掉每行文字中所有小括号及内部数字,保存为"论文-提纯原文-.txt"文件。示例输出文件格式请参考"论语-提纯原文-输出示例.txt"文件。注意:示例输出文件帮助考生了解输出格式,不作它用.

来源:这道题目是python计算机二级中最后一道综合应用的大题

2. 思路分析:

① 问题1:主要是掌握读取txt文件与提取文件中的内容写入到另外一个txt中的方法,与之前读取文件的相关操作不同的是,这里需要提取文件中某个区域的内容,所以我们需要对文件中读取的内容进行判断,这里可以使用readline()逐行读取的方法或者是直接for遍历open()方法得到的对象获取每一行数据,而且因为我们需要提取某些区域的内容,也就是需要处理若干行的文本,这个时候就需要使用一个变量来标记,当遇到【原文】的时候将变量a标记为1,后续读取该区域的其他行按照【原文】对应区域块的文本进行处理,当遇到【注释】的时候那么就需要将标记变量a的值设置为0表示程序已经离开了【原文】区域,根据变量的值确定是否将文本内容输出到新的文件中。答案中提供的方法是直接for循环遍历open()中打开的文件对象的方法,没有使用到任何读取文件的方法,这与之前的文件读取的方法是不太一样的,也是值得学习的,在遍历的得到的open()文件对象的时候感觉也是按照每一行进行读取的

② 问题2:在问题1的基础上,进一步对提取后的原文内容进行清理,去掉其中的小括号以及内部的数字,例如(1)(2)等。一个简单思想是逐一进行替换上述出现的字符串为空字符串,这种替换相当于是删掉了上述的字符串,可以使用replace函数进行替换

③ 直接for循环遍历open()方法返回的文件对象的方法也是可以学习一下的,在一定程度上相当于是读取整个文件了然后逐行遍历文件中每一行的内容

3. 代码如下:

问题1:

自己写的:

if __name__ == '__main__':
    fi = open("论语.txt", "r")
    fo = open("论语-原文.txt", "w")
    txt = fi.readline()
    flag = False
    # readline方法读取可以直接判断读取到的内容是否为空来判断是否到达了文件末尾
    while txt:
        if "【原文】" in txt:
            flag = True
            txt = fi.readline()
            continue
        if "【注释】" in txt:
            flag = False
        txt = txt.strip("\n")
        if flag and txt:
            fo.write(txt + "\n")
        txt = fi.readline()
    fi.close()
    fo.close()

答案提供的:

if __name__ == '__main__':
    fi = open("论语.txt", "r")
    fo = open("论语-原文.txt", "w")
    flag = False
    # 直接for循环遍历open()文件对象
    for line in fi:
        if "【原文】" in line:
            flag = True
            continue
        if "【注释】" in line:
            flag = False
        line = line.strip("\n")
        if flag and line:
            fo.write(line + "\n")
    fi.close()
    fo.close()

问题2:

if __name__ == '__main__':
    fi = open("论语-原文.txt", "r")
    fo = open("论语-提纯原文.txt", "w")
    # 直接遍历open文件对象也属于逐行读取
    for line in fi:
        # 遍历每一行得到的是str字符串类型
        for i in range(23):
            line = line.replace("(" + str(i) + ")", "")
        fo.write(line)
    fi.close()
    fo.close()

猜你喜欢

转载自blog.csdn.net/qq_39445165/article/details/115218309
今日推荐