从两个文件中读取每一行并打印其他文件中不存在的行

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,该列表打印在结束。这不足为奇,因为在您的代码中,在 lineAlineB 匹配的情况下,您将 lineB 附加到 unique (因为附加发生在 elseif 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。