Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比较多个文件中的文本并将相同的文件保留在一个位置_Python_Duplicates - Fatal编程技术网

Python 比较多个文件中的文本并将相同的文件保留在一个位置

Python 比较多个文件中的文本并将相同的文件保留在一个位置,python,duplicates,Python,Duplicates,我在一个文件夹中有n个不同名称的文本文件,我想将文件中的文本相互比较,如果它们相同,则将它们保留在单独的文件夹中,并从主文件夹中删除。有人能帮我吗 到目前为止,我的代码是: file1=open("F1.txt","r") file2=open("F2.txt","r") file3=open("F3.txt","r") file4=open("F4.txt","r") file5=open("F5.txt","r") list1=file1.readlines() list2=file2.re

我在一个文件夹中有n个不同名称的文本文件,我想将文件中的文本相互比较,如果它们相同,则将它们保留在单独的文件夹中,并从主文件夹中删除。有人能帮我吗

到目前为止,我的代码是:

file1=open("F1.txt","r")
file2=open("F2.txt","r")
file3=open("F3.txt","r")
file4=open("F4.txt","r")
file5=open("F5.txt","r")
list1=file1.readlines()
list2=file2.readlines()
list3=file3.readlines()
list4=file4.readlines()
list5=file5.readlines()
for line1 in list1:
    for line2 in list2:
        for line3 in list3:
            for line3 in list4:
                for line4 in list5:
                    if line1.strip() in line2.strip() in line3.strip() in line4.strip() in line5.strip():
                        print line1
                        file3.write(line1)

为了进行比较,可以使用filecmp模块():

因此,解决这一问题的一种方法是(一点也不优雅,但确实有效):

给出:

{'F1.txt vs F2.txt': True, 'F1.txt vs F5.txt': False, 'F2.txt vs F4.txt': True, 
 'F3.txt vs F4.txt': False, 'F1.txt vs F4.txt': True, 'F2.txt vs F3.txt': False, 
 'F2.txt vs F5.txt': False, 'F1.txt vs F3.txt': False, 'F3.txt vs F5.txt': False, 
 'F4.txt vs F5.txt': False}
至于问题的另一部分,您可以使用内置的
shutil
os
模块,如下所示:

import shutil
import os
if filecmp.cmp('F1.txt', 'F2.txt') is True:
    shutil.move(os.path.abspath('F1.txt'), 'C:\\example\\path')
    shutil.move(os.path.abspath('F2.txt'), 'C:\\example\\path')
更新:更好的答案,修改自@zalew的答案:


您应该发布您尝试过的代码,是的,这在python中是可能的。您可以计算文件的哈希值并只比较哈希值。您可能想告诉我们您在解决问题上花费了哪些精力。我尝试了以下代码file1=open(“F1.txt”,“r”)file2=open(“F2.txt”,“r”)file3=open(“F3.txt”,“r”)file4=open(“F4.txt”,“r”)file5=open(“F5.txt”,“r”)list1=file1.readlines()list2=file2.readlines()list3=file3.readlines()list4=file4.readlines()list5=file5.readlines()对于列表1中的第1行:对于列表2中的第2行:对于列表3中的第3行:对于列表4中的第3行:对于列表5中的第4行:如果line1.strip()位于line2中,则line3中的strip()位于line4中。strip()位于line5中的strip():打印line1文件3.写入(line1)上面的代码无法解决我的问题。它是否适用于多个文件,如100或200@JonYes,但您将有100或200个单独的try/except语句。。最好有一个递归for循环,我建议@zalew给出这个答案。。。然后您只需要另一行
删除重复项(c:\\example\\path')
。。。然后根据我的答案编辑上面的最后一行
shutil.move(…)
文件不相同,因此我必须对类似的文件进行分组。这种情况也适用吗@不知道你说的是什么意思。。这会将文件夹中的所有文件与该文件夹中的所有其他文件进行比较,并将副本移动到指定的位置。
{'F1.txt vs F2.txt': True, 'F1.txt vs F5.txt': False, 'F2.txt vs F4.txt': True, 
 'F3.txt vs F4.txt': False, 'F1.txt vs F4.txt': True, 'F2.txt vs F3.txt': False, 
 'F2.txt vs F5.txt': False, 'F1.txt vs F3.txt': False, 'F3.txt vs F5.txt': False, 
 'F4.txt vs F5.txt': False}
import shutil
import os
if filecmp.cmp('F1.txt', 'F2.txt') is True:
    shutil.move(os.path.abspath('F1.txt'), 'C:\\example\\path')
    shutil.move(os.path.abspath('F2.txt'), 'C:\\example\\path')
import shutil
import os
import hashlib
def remove_duplicates(dir):
    unique = []
    for filename in os.listdir(dir):
        if os.path.isfile(dir+'\\'+filename):
            print('--Checking ' + dir+'\\'+filename)
            filehash = hashlib.md5(filename.encode('utf8')).hexdigest()
            print(filename, ' has hash: ', filehash)
            if filehash not in unique: 
                unique.append(filehash)
            else:
                shutil.move(os.path.abspath(filename), 'C:\\example\\path\\destinationfolder')
    return
remove_duplicates('C:\\example\\path\\sourcefolder')