簡體   English   中英

比較兩個文件的所有內容

[英]Comparing all contents of two files

我正在嘗試比較兩個文件。 一個文件有一個商店列表。 另一個列表具有相同的商店列表,只是缺少一些我從另一個腳本針對它運行的過濾器。 我想比較這兩個文件,如果文件 1 中的商店不在文件 2 中的任何位置,我想將其打印出來,或附加到列表中,在這部分不要太挑剔。 以下是兩個文件中的部分示例:

文件 1:

Store: 00377
Main number: 8033056238

Store: 00525
Main number: 4075624470

Store: 00840
Main number: 4782736996

Store: 00920
Main number: 4783337031

Store: 00998
Main number: 9135631751

Store: 02226
Main number: 3107501983

Store: 02328
Main number: 8642148700

Store: 02391
Main number: 7272645342

Store: 02392
Main number: 9417026237

Store: 02393
Main number: 4057942724

文件 2:

00377
00525
00840
00920
00998
02203
02226
02328
02391
02392
02393
02394
02395
02396
02397
02406
02414
02425
02431
02433
02442

這是我為嘗試使這項工作而構建的內容,但它只是不斷涌出文件中的所有商店。

def comparesitestest():
    with open("file_1.txt", "r") as pairsin:
        pairs = pairsin.readlines()
        pairsin.close
    with open("file_2.txt", "r") as storesin:
        stores = storesin.readlines()
        storesin.close        
    for pair in pairs:
        for store in stores:
            if store not in pair:
                print(store)

你得到你得到的輸出,因為你的檢查沒有檢查你想要的。 嘗試將您的for循環更改為如下內容:

for pairline in pairs:
    if pairline:
        name, number = pairline.split(': ')
        if name == "Store":
            if number not in stores:
                print(number)

解釋如下:您從成對的文件 1 和商店的文件 2(實際上是商店編號)開始。 您的文件 2 狀況良好。 讀入后,您將獲得商店編號列表。 你不需要把它放在第二個循環中。 事實上,這是浪費和不必要的。

您的文件 1 稍微復雜一些。 盡管您將信息成對引用,但比這要復雜一些,因為這些行有一個商店號碼,我假設是一個電話號碼。 因此,對於文件 1 中的每一行,我會檢查該行是否以“Store:”開頭,因為我知道我可以忽略所有其他行。 如果該行以“Store;”開頭,則該行的下一部分是我實際要在文件 2 的列表中檢查的商店編號。

因此,上面的程序做了更多的檢查,看它是否正在讀取需要操作的行。 然后在必要時通過檢查商店編號是否在商店編號列表中來對其進行操作。

另外,作為旁注,使用with結構非常好。 這是很好的編碼習慣。 但是當你這樣做時,你不需要明確地關閉文件。 該上下文結構會自動發生這種情況。 離開上下文后,關閉會自動發生。

另一方面,解決問題通常有多種好方法和壞方法。 另一個可能的合理解決方案/版本是:

for pairline in pairs:
    if pairline and pairline.startswith("Store:"):
        store = pairline.split()[1]
        if store not in stores:
           print(stores)

這是不同的。 不一定更好或更壞,只是不同。

當您閱讀第一個文件時,將商店編號添加到集合中。

store_nums_1 = set()
with open("file_1.txt") as f:
    for line in f:
        line = line.strip() # Remove trailing whitespace
        if line.startswith("Store"):
            store_nums_1.add(line[7:]) # Add only store number to set

接下來,讀取另一個文件並將這些數字添加到另一組

store_nums_2 = set()
with open("file_2.txt") as f:
    for line in f:
        line = line.strip() # Remove trailing whitespace
        store_nums_2.add(line) # The entire line is the store number, so no need to slice.

最后,找出兩個集合之間的集合差異。

file1_extras = store_nums_1 - store_nums_2

它給出了一個只包含文件 1 而不是文件 2 中的商店編號的集合。(我將你的file_2更改為只有前三行,因為你顯示的文件實際上包含比file_1更多的商店編號,所以結果file1_extras使用您的輸入是空的)

{'00920', '00998', '02226', '02328', '02391', '02392', '02393'}

這比使用列表更有效,因為檢查列表中是否存在某些內容是O(N)操作。 當您對第一個列表中的M項中的每一項執行一次時,您最終會得到一個O(N*M)操作。 另一方面,集合中的成員資格檢查是O(1) ,因此整個集合差分操作是O(M)而不是O(N*M)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM