【问题标题】:How to compare two different files line by line and write the difference in third file?如何逐行比较两个不同的文件并将差异写入第三个文件?
【发布时间】:2011-12-07 03:25:00
【问题描述】:

我想比较两个文本文件,每个文件都有三列。一个文件有 999 行,另一个文件有 757 行。我希望将不同的 242 行存储在不同的文件中。我使用随机网络生成器创建了第一个文件(999 行)(999 行是边,第三列是第一、第二列之间的权重 - 源节点、目标节点)。

文件格式 - 文件 1、2

1 3 1
16 36 1

我试过了

Compare two files line by line and generate the difference in another filefind difference between two text files with one item per linehttp://www.daniweb.com/software-development/python/threads/124932/610058#post610058

都不适合我。

我认为是字符串比较的问题。我想比较第一列和第二列中的数字。如果它们都不同,我想将其写入第三个文件。

任何帮助将不胜感激!

更新

我发布了@MK 发表评论后我尝试的以下代码。

f = open("results.txt","w")

for line in file("100rwsnMore.txt"):
    rwsncount += 1
    line = line.split()
    src = line[0]
    dest = line[1]
    for row in file("100rwsnDeleted.txt"):
        row = row.split()
        s = row[0]
        d = row[1]
        if(s != src and d != dest):
             f.write(str(s))
             f.write(' ')
             f.write(str(d))
             f.write('\n')

f.close()

【问题讨论】:

  • 不是一个真正的问题。究竟什么没用,你到底尝试了什么?
  • 好老的diff(1)怎么了?
  • 这有 999 行!我需要将差异写入另一个文件。它已将 1752 行写入一个新文件。
  • "sort filea fileb | uniq" 会更好。
  • 你试过Python的difflib吗?

标签: python file


【解决方案1】:

如果您在 *nix 系统上,最好的通用选项就是使用:

sort filea fileb | uniq -u

但是如果你需要使用 Python:

您的代码在外部文件的每次迭代中重新打开内部文件。在循环外打开它。

使用嵌套循环的效率低于循环第一个存储找到的值,然后将第二个与这些值进行比较。

def build_set(filename):
    # A set stores a collection of unique items.  Both adding items and searching for them
    # are quick, so it's perfect for this application.
    found = set()

    with open(filename) as f:
        for line in f:
            # [:2] gives us the first two elements of the list.
            # Tuples, unlike lists, cannot be changed, which is a requirement for anything
            # being stored in a set.
            found.add(tuple(sorted(line.split()[:2])))

    return found

set_more = build_set('100rwsnMore.txt')
set_del = build_set('100rwsnDeleted.txt')

with open('results.txt', 'w') as out_file:
   # Using with to open files ensures that they are properly closed, even if the code
   # raises an exception.

   for res in (set_more - set_del):
      # The - computes the elements in set_more not in set_del.

      out_file.write(" ".join(res) + "\n")      

【讨论】:

  • 谢谢扎克的回复。并非 100rwsnDeleted 文件中的每一行都被删除。行数是 350,应该是 242。我最初通过将“更多”文件与另一个文件(242 行)进行比较,从 100rwsnMore 文件创建了 100rwsnDeleted 文件。我只是想明确一点,100rwsnDeleted 文件中的所有行都派生自 100rwsnMore 文件。
  • @bhanu 我刚刚做了一个修复,它应该可以按照您期望的方式运行,试一试。
  • 我试过了。它添加了太多行。计数是 942。我会尝试上传文本文件。
  • 啊,我想我明白了,我在设置比较中更改了运算符,试一试。
  • 没有任何改变。我必须提到,如果较大的文件有 11 86 1 作为一行,而第二个文件有 86 11 1 作为一行,则必须将其视为公共边,不应出现在 results.txt 文件中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
相关资源
最近更新 更多