两个 TXT 文件之间的差异词

Delta words between two TXT files

我想计算两个文件之间的增量字。

Unix 系统上的

diff 命令提供以下信息。 difflib 可以给出类似的输出。

$ diff file_1.txt file_2.txt 
1c1
< One file with some text and words.
---
> One file with some text and additional words to be found.

有没有一种简单的方法可以找到在两个文件之间添加或删除的单词,或者至少像 git diff --word-diff 那样在两行之间添加或删除单词。

首先,您需要使用 open() 将文件读入字符串,其中 'file_1.txt' 是文件路径,'r' 是 "reading mode"。 第二个文件类似。完成后不要忘记 close() 您的文件! 使用 split(' ') 函数将您刚刚阅读的字符串拆分为单词列表。

file_1 = open('file_1.txt', 'r')
text_1 = file_1.read().split(' ')
file_1.close()
file_2 = open('file_2.txt', 'r')
text_2 = file_2.read().split(' ')
file_2.close()

下一步您需要了解 text_1text_2 列表变量(对象)之间的区别。 有很多方法可以做到。

1)

您可以使用 collections 库中的 Counter class。 将你的列表传递给 class 的构造函数,然后通过正序和倒序相减找到差异,调用 elements() 方法获取元素并调用 list() 将其转换为列表类型。

from collections import Counter
text_count_1 = Counter(text_1)
text_count_2 = Counter(text_2)
difference = list((text_count_1 - text_count_2).elements()) + list((text_count_2 - text_count_1).elements())

这里是计算delta字的方法。

from collections import Counter
text_count_1 = Counter(text_1)
text_count_2 = Counter(text_2)

delta = len(list((text_count_2 - text_count_1).elements())) \
      - len(list((text_count_1 - text_count_2).elements()))

print(delta)

2)

使用 difflib 库中的 Differ class。将两个列表传递给 Differ class 的 compare() 方法,然后用 for.

对其进行迭代
from difflib import Differ
difference = []
for d in Differ().compare(text_1, text_2):
    difference.append(d)

然后就可以这样算delta字了

from difflib import Differ

delta = 0

for d in Differ().compare(text_1, text_2):
    status = d[0]

    if status == "+":
        delta += 1

    elif status == "-":
        delta -= 1

print(delta)

3)

你可以自己写差异方法。例如:

def get_diff (list_1, list_2):
    d = []
    for item in list_1:
        if item not in list_2:
            d.append(item)
    return d

difference = get_diff(text_1, text_2) + get_diff(text_2, text_1)

我认为还有其他方法可以做到这一点。但我会限制三个。 由于您获得了 difference 列表,您可以随心所欲地管理输出。

..这是使用 dict()

的另一种方法
#!/usr/bin/python

import sys


def loadfile(filename):
  h=dict()
  f=open(filename)
  for line in f.readlines():
    words=line.split(' ')
    for word in words:
        h[word.strip()]=1
  return h

first=loadfile(sys.argv[1])
second=loadfile(sys.argv[2])


print "in both first and second"
for k in first.keys():
  if k and k in second.keys():
    print k