使用Python以成对方式比较文件

时间:2018-09-10 15:28:31

标签: python

我正在尝试比较同一目录中两个文件的内容以匹配行。我想最终以成对的方式进行此操作。现在,我已经编写了一些代码,这些代码将使目录中的第一个文件保持打开状态,并将其与该目录中的其余文件进行比较。我在执行时遇到的麻烦是对目录中的第二个文件重复逻辑,然后对第三个文件重复逻辑,等等。

我是Python的新手,只是利用我到目前为止获得的知识来执行此代码。我正在考虑为第一个文件添加另一个计数器。这样,一旦将文件与第一个文件进行比较,便在file1counter中添加了一个文件,因此,现在file1read正在打开file1read [1]并重复。

import os
#define path where files to be compared are located
path = ("/path/to/files/")
#lists all files in a directory and sorts them alphabetically
files = sorted(os.listdir( path ))
#count the number of files in the directory
number_files = len(files)

count = 1
#open first file in the directory
file1 = open(path+files[0], 'r')
#store lines of the file 
file1read = file1.read().splitlines() 

#while loop to compare file 1 to file 2, then file 1 to file 3 ... to file n
while (count < number_files):
    file2 = open(path+files[count], 'r')
    file2read = file2.read().splitlines() 
    for i in file1read:
        for j in file2read:
            if i == j:
                print (os.path.basename(file1.name)+"_"+os.path.basename(file2.name)+" have {} in common".format(j))
    count = count + 1

1 个答案:

答案 0 :(得分:1)

您可以使用itertools.combinations获取目录中所有唯一的文件对,并使用this解决方案中的集合来确定文件之间的相似性。此外,glob软件包比os.listdir具有更好的功能,因为它列出了给定目录中文件的正确路径:

import itertools
import glob

path = ("/path/to/files/")

for files in itertools.combinations(glob.glob(path + '*'), 2):
    file1, file2 = map(open, files)
    similarities = set(file1).intersection(file2)
    if similarities:
        print('_'.join(files), 'have {} in common'.format(','.join(similarities))