从两个文件中读取每一行并打印其他文件中不存在的行
Read each line from two files and print line that does not exists in other
团队,我有两个文件有一些重复项。我想打印或创建具有独特列表的新列表。但是,我的列表打印出来是空的。不知道为什么
f1 = open(file1, 'r')
f2 = open(file2, 'r')
unique = []
for lineA in f1.readlines():
for lineB in f2.readlines():
if lineA != lineB:
print("lineA not equal to lineB", lineA, lineB)
else:
unique.append(lineB)
print(unique)
输出
lineA not equal to lineB node789
node321
lineA not equal to lineB node789
node12345
[]
预计
lineA not equal to lineB node789
node321
lineA not equal to lineB node789
node12345
[node321,node12345]
查看评论列表的第二种方法正在填充,但全部为空且无法识别实际字符串。
[~] $ cat ~/backup/2strings.log
restr1
restr2
[~] $ cat ~/backup/4strings.log
restr1
restr2
restr3
restr4
file2 = os.environ.get('HOME') + '/backup/2strings.log'
file1 = os.environ.get('HOME') + '/backup/4strings.log'
f1 = open(file1, 'r')
f2 = open(file2, 'r')
unique = []
for lineA in f1.readlines():
for lineB in f2.readlines():
# if lineA.rstrip() != lineB.rstrip():
if lineA.strip() != lineB.strip():
print("lineA not equal to lineB", lineA, lineB)
else:
print("found uniq")
unique.append(lineB.rstrip())
print(unique)
print(len(unique))
输出
found uniq
lineA not equal to lineB restr1
restr2
lineA not equal to lineB restr1
['', '', '', '', '']
5
正如我从您 post 看到的那样,您的预期输出与实际输出不同的唯一方式是 node321 和 node12345 未添加到列表 unique
,该列表打印在结束。这不足为奇,因为在您的代码中,在 lineA
和 lineB
匹配的情况下,您将 lineB
附加到 unique
(因为附加发生在 else
在 if lineA != lineB:
之后)。
我建议您使用一种不同但更简单的方法。使用 sets
数据结构。 Link - https://docs.python.org/3/tutorial/datastructures.html#sets
伪代码
unique = []
items01 = set([line.strip() for line in open(file1).readlines()])
items02 = set([line.strip() for line in open(file2).readlines()])
# unique items not present file2
print(list(items01 - items02))
unique += list(items01 - items02)
# unique items not present file2
print(list(items02 - items01))
unique += list(items02 - items01)
# all unique items
print(unique)
在您的代码中,您使用 file01 作为参考来检查 file01 中的项目。你也需要做相反的事情。挑战 2 是时间复杂度过高。 Python sets 在内部进行哈希处理以提高性能,因此请使用 sets。
团队,我有两个文件有一些重复项。我想打印或创建具有独特列表的新列表。但是,我的列表打印出来是空的。不知道为什么
f1 = open(file1, 'r')
f2 = open(file2, 'r')
unique = []
for lineA in f1.readlines():
for lineB in f2.readlines():
if lineA != lineB:
print("lineA not equal to lineB", lineA, lineB)
else:
unique.append(lineB)
print(unique)
输出
lineA not equal to lineB node789
node321
lineA not equal to lineB node789
node12345
[]
预计
lineA not equal to lineB node789
node321
lineA not equal to lineB node789
node12345
[node321,node12345]
查看评论列表的第二种方法正在填充,但全部为空且无法识别实际字符串。
[~] $ cat ~/backup/2strings.log
restr1
restr2
[~] $ cat ~/backup/4strings.log
restr1
restr2
restr3
restr4
file2 = os.environ.get('HOME') + '/backup/2strings.log'
file1 = os.environ.get('HOME') + '/backup/4strings.log'
f1 = open(file1, 'r')
f2 = open(file2, 'r')
unique = []
for lineA in f1.readlines():
for lineB in f2.readlines():
# if lineA.rstrip() != lineB.rstrip():
if lineA.strip() != lineB.strip():
print("lineA not equal to lineB", lineA, lineB)
else:
print("found uniq")
unique.append(lineB.rstrip())
print(unique)
print(len(unique))
输出
found uniq
lineA not equal to lineB restr1
restr2
lineA not equal to lineB restr1
['', '', '', '', '']
5
正如我从您 post 看到的那样,您的预期输出与实际输出不同的唯一方式是 node321 和 node12345 未添加到列表 unique
,该列表打印在结束。这不足为奇,因为在您的代码中,在 lineA
和 lineB
匹配的情况下,您将 lineB
附加到 unique
(因为附加发生在 else
在 if lineA != lineB:
之后)。
我建议您使用一种不同但更简单的方法。使用 sets
数据结构。 Link - https://docs.python.org/3/tutorial/datastructures.html#sets
伪代码
unique = []
items01 = set([line.strip() for line in open(file1).readlines()])
items02 = set([line.strip() for line in open(file2).readlines()])
# unique items not present file2
print(list(items01 - items02))
unique += list(items01 - items02)
# unique items not present file2
print(list(items02 - items01))
unique += list(items02 - items01)
# all unique items
print(unique)
在您的代码中,您使用 file01 作为参考来检查 file01 中的项目。你也需要做相反的事情。挑战 2 是时间复杂度过高。 Python sets 在内部进行哈希处理以提高性能,因此请使用 sets。