我有两个文件,并希望找到第二个文件中不包含第一个使用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
答案 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']
expected_lines = [line.strip() for line in open('file1', 'r').readlines()]
此行创建file1
中所有已剥离行的列表(在每行末尾删除以删除\n
)
absent_lines = []
这只是您要存储要输出的行的列表
for循环只是迭代file2
中的行,并检查当前file1
行中是否存在来自file2
的预期行。
因为你想测试字符串中是否存在单词,所以在确定任何单词存在之前,你必须遍历所有单词集。
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