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

Python 如何打印不包含其他文件中任何字符串的文件行,python,Python,我有两个文件,希望使用python查找第二个文件中不包含第一个文件中任何字符串的所有行 文件1: 文件2: 期望输出: Berries GGHLSKSKSJD JSJSJS Cats HHLFKDKDOS 我开始写这个脚本(如下),但后来意识到它会打印出第二个文件中的每一行,其中不包含第一个文件中的每个单词,用于第一个文件的每次迭代。有人能帮忙吗 import sys headers = list() with open(sys.argv[1], 'r') as search_list:

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

文件1:

文件2:

期望输出:

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

下面是一段代码:

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提取预期行 此行创建
file1
中所有剥离行的列表(剥离以删除每行末尾的
\n

2.初始化输出列表 这只是存储要输出的行的列表

3.在文件2中循环并查找缺少的行 for循环只需在
file2
中的行上迭代,并检查当前
file2
行中是否不存在
file1
中预期的行

因为您想测试字符串中是否存在一组单词,所以必须在确保这些单词中的任何一个存在之前遍历所有单词集

4.如果没有匹配项,则追加到输出列表

如果您不想存储输出,而只想打印输出,那么您可以使用set运算符替换
缺少的行。append(line.strip())
by
print line

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

一切正常,您只需更改上一个
循环

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

Cats HHLFKDKDOS
Berries GGHLSKSKSJD JSJSJS

您还可以使用正则表达式联合:

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

您的文件的
类型是什么?例如csv、tsv?
for record in open(sys.argv[2], 'r'):
    if record.split()[0] not in headers:
        print(record.strip())

Cats HHLFKDKDOS
Berries GGHLSKSKSJD JSJSJS
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)
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