首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python从txt文件中删除paratext (或“噪音”)

问使用Python从txt文件中删除paratext (或“噪音”)
EN

Stack Overflow用户
提问于 2016-10-14 08:33:35
回答 1查看 274关注 0票数 1

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

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

代码语言:javascript
复制
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是一本特定小说的实际内容的开始和结束编号。然而,输出文件只输出一个.txt文件,在linenumber 80之前删除文本,它仍然包含行号2741之后的所有内容。我似乎不明白为什么。也许我没有以正确的方式使用枚举()函数。

另一件事是,我想去掉..txt文件中所有不必要的空格。但是,当我在这段代码中实现.strip()方法时,它似乎无法工作。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-14 08:36:08

enumerate已经在其索引旁边提供了行,因此不需要再次调用文件对象上的readline,因为这会导致不可预测的行为--更像是以双倍的速度读取文件对象:

代码语言:javascript
复制
for line_number, line in enumerate(inputfile, 1):
    if line_number >= 80 and line_number <= 2741: 
        outputfile.write(line)
#                        ^^^^

作为使用enumerate和遍历整个文件的替代方法,您可以考虑使用itertools.islice对文件对象进行切片,这将获取开始和停止索引,然后使用writelines将切片序列写入输出文件。

代码语言:javascript
复制
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。

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40038596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档