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