Мои два входных файла:
file1.txt
* * 1004
'WORD': 1
'MULTIPLE WORDS': 1
'OTHER': 2
file2.txt
'WORD'
'NONEXISTENT'
Если file2.txt
гарантированно не содержать несколько слов в строке, то нет необходимости явно фильтровать их из первого файла. Это будет сделано тестом членства:
# Build a set of what words we can return a count for.
with open('file2.txt', 'r') as f:
allowed_words = set(word.strip() for word in f)
# See which of them exist in the first file.
with open('file1.txt', 'r') as f:
for line in f:
word, count = line.strip().split(':')
# This assumes that strings with a space (multiple words) do not exist in
# the second file.
if word in allowed_words:
print word, count
И выполнение этого дает:
$ python extract.py
'WORD' 1
Если file2.txt
может содержать несколько слов, просто измените тест в цикле:
# Build a set of what words we can return a count for.
with open('file2.txt', 'r') as f:
allowed_words = set(word.strip() for word in f)
# See which of them exist in the first file.
with open('file1.txt', 'r') as f:
for line in f:
word, count = line.strip().split(':')
# This prevents multiple words from being selected.
if word in allowed_words and not ' ' in word:
print word, count
Заметьте, я не удосужился вычеркнуть цитаты из слов. Я не уверен, если это необходимо - это зависит от того, будет ли вход гарантированно иметь их или нет. Было бы тривиально добавить их.
Что-то еще, что вы должны учитывать, это чувствительность к регистру. Если строчные и прописные слова должны рассматриваться как одно и то же, перед преобразованием следует преобразовать все вводимые данные в прописные (или строчные, неважно, какие).
РЕДАКТИРОВАТЬ : Вероятно, было бы более эффективно удалить несколько слов из набора разрешенных слов, чем выполнять проверку в каждой строке file1
:
# Build a set of what words we can return a count for.
with open('file2.txt', 'r') as f:
allowed_words = set(word.strip() for word in f if not ' ' in f)
# See which of them exist in the first file.
with open('file1.txt', 'r') as f:
for line in f:
word, count = line.strip().split(':')
# Check if the word is allowed.
if word in allowed_words:
print word, count