比较两个 .txt,difflib 模块告诉我一行是唯一的('-'),而实际上它存在于两个 .txt 中

comparing two .txt, difflib module tells me that a line is unique ('-') when in fact it is present in both .txt

我需要有关 difflib 模块的帮助。

我正在使用 difflib (https://docs.python.org/3/library/difflib.html) 逐行比较来自 url 的 2 个 txt,并查找重复项和缺失行。 difflib 标志每行都有一个“-”,它只在其中一个 txt 中是唯一的,但是,当我 运行 python 中的代码时,我可以看到一些标有“-”的行,但是那些行都存在于两个 txt 中(不应该,它应该只存在于其中一个 txt 中,而不是两个)。

这些是我比较的2个txt: https://sumo.media/ads_1.txt--- https://sumo.media/ads_2.txt

有谁知道为什么会这样?我在最后给你看一张截图,输出使用 difflib。查看'appnexus.com, 8610, DIRECT, f5ab79cb980f11d1'行(开头包含一个'-',告诉我它在https://sumo.media/ads_1.txt中是唯一的)。这不是真的,因为如果我转到两个 txt urls,我可以在两个 txt.

中看到这一行

奇怪的是,如果我分析较少的行,它会起作用,但它不适用于很多行。我需要分析大量的线,所以我需要一个解决方案。任何的想法?也许还有其他选择?

我也附上我的代码运行。我这样做的方法是获取带有请求的 txt urls 并为每个请求分配一个变量。然后我应用一个 splitlines() 并且它 returns 一个数组,每行都有一个值(作为字符串)。我得到 2 个数组,每个 txt 一个。最后,我比较了这两个数组以查看哪些行重复或缺失:

adstxt_1 = requests.get('http://www.sumo.media/ads_1.txt').text
adstxt_2 = requests.get('http://www.sumo.media/ads_2.txt').text


a = adstxt_1.splitlines()    # split line by line
b = adstxt_2.splitlines()    # split line by line

differ = difflib.Differ()
diffs = list(differ.compare(a, b))
for c in diffs:
    print(c)

代码告诉我的内容(ex 的这一行以 '-' 开头,在 ads_1.txt 中应该是唯一的): python output

...但我在两个 .txt 中都看到了同一行: /ads_1.txt--- /ads_2.txt

感谢任何帮助!

difflib flag with a '-' each line that it's only unique in one of those txt

没有

您似乎 (a) 误解了 -+ 字符在 diff 输出中的含义,并且 (b) 遗漏了 difflib 考虑行顺序的要点在文件中。

差异输出行开头的 - 表示在第一个文件中找到但在第二个文件中不在同一点的行。行首的 + 表示该行在第二个文件中找到,但在第二个文件中的同一点未找到。

查看输出中的其他地方。以及看到行

- appnexus.com, 8610, DIRECT, f5ab79cb980f11d1

最后,您还会看到行

+ appnexus.com, 8610, DIRECT, f5ab79cb980f11d1

再往上。 appnexus.com, 8610, DIRECT, f5ab79cb980f11d1 行出现在两个文件中,但不在两个文件中的相同位置。

如果您希望忽略行的顺序,则需要在比较文件之前对从文件中读取的行进行排序。

diff 不检查行在所有文件中是否唯一,而是检查行是否在其他文件中的同一位置 - 因此您应该首先对行进行排序。

但是如果您想检查两个文件中是否存在行或者它们在一个文件中是否唯一,那么最好转换为 set() 并比较集合。


最少的工作代码

a = ['A', 'B', 'C']
b = ['A', 'C', 'D']

print('a:', a)
print('b:', b)

set_a = set(a)
set_b = set(b)

print('--- duplicated ---')

duplicated = set_a & set_b

for item in sorted(duplicated):
    print(item)
    
print('--- unique a ---')

unique_a = set_a - set_b

for item in sorted(unique_a):
    print(item)

print('--- unique b ---')

unique_b = set_b - set_a

for item in sorted(unique_b):
    print(item)

结果

a: ['A', 'B', 'C']
b: ['A', 'C', 'D']
--- duplicated ---
A
C
--- unique a ---
B
--- unique b ---
D