【问题标题】:Python, compare 2 txt files, find unique lines in the 2nd txt file and output to a new txt filePython,比较2个文本文件,在第2个txt文件中找到唯一的行并输出到一个新的txt文件
【发布时间】:2021-03-23 10:23:52
【问题描述】:

尝试了一堆代码,这是我得到的最后一个不同行的代码,但不是全部。正如标题所说,我正在尝试从第二个 txt 文件中找到唯一的行并输出到一个新的 txt 文件。

list1 = open('C:\\1.txt','r',encoding='utf-8')
list2 = open('C:\\2.txt','r',encoding='utf-8')

list_difference = []
for item in list2:
  if item not in list1:
    list_difference.append(item)

with open('some_output_file.txt','w',encoding='utf-8') as file_out:
    for line in item:
        file_out.write(line)```

【问题讨论】:

  • 尝试添加list1 = open('C:\\1.txt','r',encoding='utf-8').readlines() 将打开的文件变成一个列表。它应该可以工作。
  • @Pietro 奇怪的是,它没有输出不同的行,输出文件中只写了 1 个公共行,更准确地说是第二个文件的最后一行。所以基本上没有区别。
  • @cambuchi 答案应该表明我的意思
  • @Pietro 也感谢您的快速回复。有更快的方法吗?每个文件有超过 2kk 行

标签: python compare


【解决方案1】:

为了更快的解决方案,将列表转换为集合:

list1 = open("file1.txt", "r", encoding="utf-8").readlines()
list2 = open("file2.txt", "r", encoding="utf-8").readlines()

set1 = set(list1)
set2 = set(list2)
print(f"len set1 {len(set1)}")
print(f"len set2 {len(set2)}")

# free the memory used by the lists
del list1
del list2

set_diff = set()
for item in set2:
    if item not in set1:
        set_diff.add(item)

print(f"len set_diff {len(set_diff)}")
print(set_diff)

检查item in set 以恒定的 O(1) 时间运行,而对于列表是 O(n)。

干杯!

【讨论】:

  • 我应该用open('some_output_file.txt','w',encoding='utf-8') as file_out: for line in list_difference: file_out.write(line)替换最后2个打印行
  • 我也应该删除前 2 个打印行,对吗?我不想在屏幕上打印任何东西
  • 哇,这个代码立竿见影!谢谢
【解决方案2】:
list1 = open('C:\\1.txt','r',encoding='utf-8').readlines()
list2 = open('C:\\2.txt','r',encoding='utf-8').readlines()
# .readlines() returns a list of each line in the file.

list_difference = []
for item in list2:
  if item not in list1:
    list_difference.append(item)

with open('some_output_file.txt','w',encoding='utf-8') as file_out:
    for line in list_difference:
        file_out.write(line)

这会将文本文件的每一行输出到相应的列表中。然后将这些独特的行写入'some_output_file.txt'

【讨论】:

  • 有更快的方法吗?每个文件有超过 2kk 行
  • 我怎样才能选择两个答案都正确?
  • 您只能选择一个答案为正确,但您可以对左边的答案进行投票。