如何打印不包含其他文件中的任何字符串的文件的行

时间:2017-05-03 11:49:56

标签: python

我有两个文件,并希望找到第二个文件中不包含第一个使用python的任何字符串的所有行。

文件1:

Apples
Frogs
Beans
Dogs
Lemons
Oranges

文件2:

Frogs THAKJD
Beans THSHSKOO
Cats HHLFKDKDOS
Dogs PHOODLLSI PSODIW
Lemons OOPOETHTH ROROR
Berries GGHLSKSKSJD JSJSJS
Apples THKDHS
Oranges EHTHTJEJ

期望的输出:

Berries GGHLSKSKSJD JSJSJS
Cats HHLFKDKDOS

我开始编写这个脚本(下面)但后来意识到它打印出第二个文件中的每一行,它不包含第一个文件中的每个单词,对于第一个文件的每次迭代。有人可以帮忙吗?

import sys

headers = list()

with open(sys.argv[1], 'r') as search_list:
    for line in search_list:
        headers.append(line.rstrip())

for record in open(sys.argv[2], 'r'):
    for head in headers:
        if head not in record:
            print record

4 个答案:

答案 0 :(得分:1)

以下是一段代码:

expected_lines = [line.strip() for line in open('file1', 'r').readlines()]
absent_lines = []

for line in open('file2', 'r'):
    exists = False
    for expected in expected_lines:
        if expected in line:
            exists = True

    if not exists:
        absent_lines.append(line.strip())

print absent_lines

输出继电器:

['Cats HHLFKDKDOS', 'Berries GGHLSKSKSJD JSJSJS']

它做什么

1提取预期行

expected_lines = [line.strip() for line in open('file1', 'r').readlines()]

此行创建file1中所有已剥离行的列表(在每行末尾删除以删除\n

2。初始化输出列表

absent_lines = []

这只是您要存储要输出的行的列表

3。循环在file2&寻找缺席线

for循环只是迭代file2中的行,并检查当前file1行中是否存在来自file2的预期行。

因为你想测试字符串中是否存在单词,所以在确定任何单词存在之前,你必须遍历所有单词集。

4。如果没有匹配,则附加到输出列表

    if not exists:
        absent_lines.append(line.strip())

如果您不想存储输出但只打印输出,那么您只需将absent_lines.append(line.strip())替换为print line

答案 1 :(得分:1)

一切都很好,你只需要改变你的上一个loop

for record in open(sys.argv[2], 'r'):
    if record.split()[0] not in headers:
        print(record.strip())

Cats HHLFKDKDOS
Berries GGHLSKSKSJD JSJSJS

答案 2 :(得分:0)

您可以使用集合运算符

import sys

headings = set(open(sys.argv[1], "r").read().split('\n'))

for record in open(sys.argv[2], 'r'):
    r = set(record.split(' ')
    if len(headings.intersection(r)) == 0:
        print record

答案 3 :(得分:0)

你也可以使用正则表达式联盟:

file_1 = """Apples
Frogs
Beans
Dogs
Lemons
Oranges"""

import re
avoid_words = re.compile('|'.join(re.escape(word) for word in file_1.splitlines()))
# Apples|Frogs|Beans|Dogs|Lemons|Oranges

并拒绝符合此模式的行:

file_2 = """Frogs THAKJD
Beans THSHSKOO
Cats HHLFKDKDOS
Dogs PHOODLLSI PSODIW
Lemons OOPOETHTH ROROR
Berries GGHLSKSKSJD JSJSJS
Apples THKDHS
Oranges EHTHTJEJ"""
selected_lines = [line for line in file_2.splitlines() if not avoid_words.match(line)]
# ['Cats HHLFKDKDOS', 'Berries GGHLSKSKSJD JSJSJS']

作为奖励,您可以确保'^'只考虑第一个单词:

avoid_words = re.compile('^('+'|'.join(re.escape(word) for word in file_1.splitlines())+')')
# ^(Apples|Frogs|Beans|Dogs|Lemons|Oranges)

或仅使用r'\b'作为单词边界的完整单词:

avoid_words = re.compile(r'\b('+'|'.join(re.escape(word) for word in file_1.splitlines())+r')\b')
# \b(Apples|Frogs|Beans|Dogs|Lemons|Oranges)\b