在Python中删除不同文本文件中的重复单词

时间:2017-07-24 06:30:46

标签: python python-2.7 python-3.x

我正在尝试删除比较两个不同文件的相同单词。

file_list.txt和name.txt是文件。

我想要做的是比较两个文件并删除file_list.txt中的一个单词

如果name.txt中有相同的单词

例如, file_list.txt包含以下行

D:\working\Python
D:\working\perl
D:\working\java
D:\working\C++

和name.txt在

下面有一行
Python
perl

然后结果应该是这样的。

D:\working\
D:\working\
D:\working\java
D:\working\C++

或者如果删除行也是一个好方法,所以只有第三行和第四行保持这样。

D:\working\java
D:\working\C++

我试图在此网站中找到解决方案,但此代码仅在以下情况下有效 匹配一条线,而不是一个单词。

import fileinput
with open('file_list.txt') as fin:
    exclude = set(line.rstrip() for line in fin)

for line in fileinput.input('name.txt', inplace=True):
    if line.rstrip() not in exclude:
        print line,

3 个答案:

答案 0 :(得分:2)

我会切换订单,然后创建一堆“坏词”。然后,我会检查我的每一行是否包含坏词。

这是我对您的代码的建议修改:

with open('name.txt') as names:
    bad_words = set(name.rstrip() for name in names)

with open('file_list.txt') as fin:
    for line in fin:
        if not any(bad_word in line for bad_word in bad_words):
            print(line)

答案 1 :(得分:0)

您的条件if line.rstrip() not in exclude正在测试整行是否在排除字词列表中。

一个简单的解决方法是将其替换为if any(word in line for word in exclude)

如果您保证所有行的格式与您提供的列表相同,那么您可以在最终\之后提取文本并检查它是否在您的排除列表中,这将更多有效:

if '\' in line and line.split('\')[-1].strip() in exclude:
    ...

答案 2 :(得分:0)

由于您已经有一组要排除的单词,因此您可以构建一组路径部分并检查它们是否intersect

from pathlib import Path

with open('name.txt') as fin:
    exclude = set(line.rstrip() for line in fin)

with fileinput.input('file_list.txt', inplace=True) as f:
    for line in f:
        if not exclude.intersection(Path(line.rstrip()).parts):
            print(line, end='')

这是Python 3的答案,因为您已包含相关标记。要在Python 2中使用pathlib,您可以使用pathlib2 backports包。或者,您可以使用os.sep分割:

import os

...

with fileinput.input('file_list.txt', inplace=True) as f:
    for line in f:
        if not exclude.intersection(line.rstrip().split(os.sep)):
            print(line, end='')

请注意,这只会删除完全匹配,而不是例如:

D:\working\CPython

给定的

Python
perl

如果您需要更通用的子字符串匹配,请参阅使用字符串membership tests的其他答案。