所以我有一个很大的文本文件,大约900MB,我想逐行读取文件,并且对于每一行,做查找和替换,根据短语列表中的项目,我们来假设一个情况
假设我有一个.txt文件,其中包含所有纯文本维基百科。
我有一个python短语列表,称之为P,P = ['hello world','twly three','any bigram','any trigram'],P中的所有项目都是短语(不存在单个单词(
给定此列表 P,我正在尝试扫描 .txt 文件,逐行并使用 P,检查当前行中是否存在任何 P 的项目,如果它们确实存在,请用 _ 替换单词之间的空格,例如,如果当前行说:"你好世界,三个任何文本都在这里",它应该像这样替换它: "hello_world twently_three任何文本都放到这里" 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)
不应在每一行都打开和关闭输出文件。更重要的是,您可以存储每个concept_phrase
的替换,并避免对concept_phrases
的翻译版本进行k * n替换(k是概念短语的数量,n是行数(:
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
通常很快,我怀疑即使重复调用str.replace
,用re.sub
一次性替换也不会击败它。
我建议使用cython
模块编译文件并尝试运行它。 它将加快您的代码速度。