使用 Python 从 txt 文件中删除副文本(或 'noise')
Using Python to remove paratext (or 'noise') from txt files
我正在准备一个文本文件语料库,其中包含 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 是一部特定小说的实际内容的开始和结束编号。但是,输出文件仅输出一个 .txt 文件,其中删除了第 80 行之前的文本,它仍然包含第 2741 行之后的所有内容。我似乎不明白为什么。也许我没有以正确的方式使用 enumerate() 函数。
另一件事是我想删除 .txt 文件中所有不必要的空格。但是当我在这段代码中实现 .strip() 方法时,它似乎不起作用。
谁能给我一个解决这个问题的建议?非常感谢!
enumerate
已经在其索引旁边提供了 行,因此您不需要再次调用文件对象上的 readline
,因为那样会导致不可预测的行为 - 更像是以双倍速度读取文件对象:
for line_number, line in enumerate(inputfile, 1):
if line_number >= 80 and line_number <= 2741:
outputfile.write(line)
# ^^^^
作为使用 enumerate
和遍历整个文件的替代方法,您可以考虑使用 切片 文件对象 itertools.islice
which takes the start and stop indices, and then writing the sliced sequence to the output file using writelines
:
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()
此外,您可以打开 文件并将closing/cleanup 保留为Python,方法是使用上下文管理器with[=33] =] with
语句。参见 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)
我正在准备一个文本文件语料库,其中包含 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 是一部特定小说的实际内容的开始和结束编号。但是,输出文件仅输出一个 .txt 文件,其中删除了第 80 行之前的文本,它仍然包含第 2741 行之后的所有内容。我似乎不明白为什么。也许我没有以正确的方式使用 enumerate() 函数。
另一件事是我想删除 .txt 文件中所有不必要的空格。但是当我在这段代码中实现 .strip() 方法时,它似乎不起作用。
谁能给我一个解决这个问题的建议?非常感谢!
enumerate
已经在其索引旁边提供了 行,因此您不需要再次调用文件对象上的 readline
,因为那样会导致不可预测的行为 - 更像是以双倍速度读取文件对象:
for line_number, line in enumerate(inputfile, 1):
if line_number >= 80 and line_number <= 2741:
outputfile.write(line)
# ^^^^
作为使用 enumerate
和遍历整个文件的替代方法,您可以考虑使用 切片 文件对象 itertools.islice
which takes the start and stop indices, and then writing the sliced sequence to the output file using writelines
:
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()
此外,您可以打开 文件并将closing/cleanup 保留为Python,方法是使用上下文管理器with[=33] =] with
语句。参见 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)