我是新的python。我有一个单词列表和一个非常大的文件。我想删除文件中包含单词列表中单词的行。
单词列表按排序给出,可以在初始化期间输入。我正在努力寻找解决这个问题的最佳方法。我现在正在进行线性搜索,这花费了太多时间。
有什么建议吗?
答案 0 :(得分:3)
你可以使用集合论中的intersection
来检查一行中的单词和单词列表是否有任何共同点。
list_of_words=[]
sett=set(list_of_words)
with open(inputfile) as f1,open(outputfile,'w') as f2:
for line in f1:
if len(set(line.split()).intersection(sett))>=1:
pass
else:
f2.write(line)
答案 1 :(得分:1)
如果源文件仅包含以空格分隔的单词,则可以使用集合:
words = set(your_words_list)
for line in infile:
if words.isdisjoint(line.split()):
outfile.write(line)
请注意,这不会处理标点符号,例如给定words = ['foo', 'bar']
,foo, bar,stuff
之类的行不会被删除。要处理这个问题,您需要使用正则表达式:
rr = r'\b(%s)\b' % '|'.join(your_words_list)
for line in infile:
if not re.search(rr, line):
outfile.write(line)
答案 2 :(得分:0)
大文件中的行和单词需要以某种方式进行排序,在这种情况下,您可以实现二进制搜索。通过检查列表中的每个单词是否在给定的行中,它看起来不是最好的线性搜索。
答案 3 :(得分:0)
contents = file.read()
words = the_list.sort(key=len, reverse=True)
stripped_contents = re.replace(r'^.*(%s).*\n'%'|'.join(words),'',contents)
类似的东西应该有用......不确定它是否比逐行扫描更快
[edit]这是未经测试的代码,可能需要稍微调整一下
答案 4 :(得分:0)
您无法就地删除这些行,您需要重写第二个文件。之后您可以覆盖旧的(请参阅shutil.copy
)。
其余的读取像伪代码:
forbidden_words = set("these words shall not occur".split())
with open(inputfile) as infile, open(outputfile, 'w+') as outfile:
outfile.writelines(line for line in infile
if not any(word in forbidden_words for word in line.split()))
有关如何摆脱标点符号引起的假阴性的方法,请参阅this question。