基于这些短语的大列表替换大文本文件中的短语的时间有效方式

时间:2017-08-26 17:19:10

标签: python linux sed replace

所以我有一个大文本文件,大约900 MB,我想逐行读取文件,对于每一行,根据短语列表中的项目进行查找和替换,让我们假设一个假设的情况

假设我有一个单独的.txt文件,其中包含纯文本中的所有维基百科。

我有一个python的短语列表,称之为P,P = ['hello world','twently three','any bigram','any trigram'],P中的所有项目都是短语(没有单个单词存在)

鉴于此列表P,我试图逐行扫描.txt文件并使用P,检查当前行中是否存在P的任何项目,如果它们存在,则用_替换单词之间的空格,例如如果当前行说:“hello world Twently three three any where here”,它应该替换为:“hello_world twently_three any text goes here” P的长度是14,000

我已经在python中实现了这个,它非常慢,它只能以大约5,000行/分钟的平均速率执行此操作,.txt文件很大,有数百万行,是否有任何有效的方法来执行此操作? 感谢

更新:

with open("/media/saurabh/New Volume/wikiextractor/output/Final_Txt/single_cs.txt") as infile:
    for index,line in enumerate(infile):
        for concept_phrase in concepts:
            line = line.replace(concept_phrase, concept_phrase.replace(' ', '_'))
        with open('/media/saurabh/New Volume/wikiextractor/output/Final_Txt/single_cs_final.txt', 'a') as file:
            file.write(line +  '\n' )  
        print (index)

2 个答案:

答案 0 :(得分:2)

您不应该在每一行打开和关闭输出文件。更重要的是,您可以存储每个concept_phrase的替换,并避免使 k * n 替换(k是概念短语的数量,n是行数)对于concept_phrases的翻译版本:

in_file = "/media/saurabh/New Volume/wikiextractor/output/Final_Txt/single_cs.txt"
out_file = "/media/saurabh/New Volume/wikiextractor/output/Final_Txt/single_cs_final.txt"
replacement = dict([(cp, cp.replace(' ', '_')) for cp in concepts])

with open(in_file) as infile, open(out_file, 'a') as file:
    for line in infile:
        for concept_phrase in concepts:
            line = line.replace(concept_phrase, replacement[concept_phrase])
        file.write(line) 

str.replace通常很快,我怀疑re.sub的一次性替换即使重复调用str.replace也会打败它。

答案 1 :(得分:1)

我建议使用cython模块编译文件并尝试运行它。它会加快你的代码。