比较两个文件的所有内容



我正在尝试比较两个文件。其中一个文件包含商店列表。另一个列表具有相同的商店列表,只是缺少了我从另一个脚本中运行的过滤器中的一些商店。我想比较一下这两个文件,如果文件1中的store在文件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)

读取第一个文件时,将存储号添加到集合中。

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)

您得到了您得到的输出,因为您的检查没有检查您想要的内容。试着把你的for循环改成这样:

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

解释如下:从包含配对的文件1和包含商店(实际上是商店编号)的文件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)

这是不一样的。不一定更好或更坏,只是不同而已。

相关内容

  • 没有找到相关文章

最新更新