使用Python从txt文件中删除paratext(或noise)

2024-09-30 06:34:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在准备一个文本文件的语料库,由170本荷兰小说组成。我是一个文学学者,对Python和编程都比较陌生。我要做的是编写一个Python脚本,从每个.txt文件中删除不属于小说(即故事)实际内容的所有内容。我想删除的内容包括:添加作者的传记、简介,以及将ePub转换为.txt时附带的其他信息。你知道吗

我的想法是为每个.txt文件手动决定小说的实际内容从哪一行开始,在哪一行结束。我使用以下代码块删除.txt文件中不包含在这两个行号之间的所有信息:

def removeparatext(inputFilename, outputFilename):
    inputfile = open(inputFilename,'rt', encoding='utf-8')
    outputfile = open(outputFilename, 'w', encoding='utf-8')

    for line_number, line in enumerate(inputfile, 1):
        if line_number >= 80 and line_number <= 2741: 
            outputfile.write(inputfile.readline())

    inputfile.close()
    outputfile.close()

removeparatext(inputFilename, outputFilename)

数字80和2741是一本具体小说的实际内容的开始和结束数字。但是,outputfile只输出一个在行号80之前删除了文本的.txt文件,它仍然包含行号2741之后的所有内容。我似乎不明白为什么。也许我没有以正确的方式使用enumerate()函数。你知道吗

另一件事是,我想摆脱所有不必要的空间在.txt文件。但是当我在这段代码中实现.strip()方法时,它似乎不起作用。你知道吗

有人能给我一个关于如何解决这个问题的建议吗?非常感谢!你知道吗


Tags: 文件代码txt信息number内容line小说
1条回答
网友
1楼 · 发布于 2024-09-30 06:34:20

enumerate已经在索引旁边提供了,因此您不需要再次调用file对象,因为这将导致不可预知的行为—更像是以两倍的速度读取file对象:

for line_number, line in enumerate(inputfile, 1):
    if line_number >= 80 and line_number <= 2741: 
        outputfile.write(line)
#                        ^^^^

作为使用enumerate并遍历整个文件的替代方法,您可以考虑使用^{}对文件对象进行切片,它采用开始和停止索引,然后使用^{}切片序列写入输出文件:

from itertools import islice

def removeparatext(inputFilename, outputFilename):
    inputfile = open(inputFilename,'rt', encoding='utf-8')
    outputfile = open(outputFilename, 'w', encoding='utf-8')

    # use writelines to write sliced sequence of lines 
    outputfile.writelines(islice(inputfile, 79, 2741)) # indices start from zero

    inputfile.close()
    outputfile.close()

此外,您还可以通过使用带有with语句的上下文管理器打开文件并将关闭/清理留给Python。见How to open a file using the open with statement。你知道吗

from itertools import islice

def removeparatext(inputFilename, outputFilename):
    with open(inputFilename,'rt', encoding='utf-8') as inputfile,\
         open(outputFilename, 'w', encoding='utf-8') as outputfile:    
        # use writelines to write sliced sequence of lines 
        outputfile.writelines(islice(inputfile, 79, 2741))


removeparatext(inputFilename, outputFilename)

相关问题 更多 >

    热门问题