【问题标题】:Comparing the text in multiple files and keeping the same files in one location比较多个文件中的文本并将相同的文件保存在一个位置
【发布时间】:2016-01-13 08:50:16
【问题描述】:

我在一个文件夹中有 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)

【问题讨论】:

  • 你应该发布你尝试过的代码,是的,这在 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() 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)
  • 上面的代码没有解决我的目的

标签: python duplicates


【解决方案1】:

see if two files have the same content in python

为了比较,你可以使用filecmp模块(http://docs.python.org/library/filecmp.html):

>>> import filecmp
>>> filecmp.cmp('F1.txt, 'F2.txt')
True
>>> filecmp.cmp('F1.txt', 'F3.txt')
False

所以解决它的一种方法是(一点也不优雅,但确实有效):

import filecmp
files = ['F1.txt', 'F2.txt', 'F3.txt', 'F4.txt', 'F5.txt']
comparisons = {}
for itm in range(len(files)):
    try:
        res = filecmp.cmp(files[itm], files[itm+1])
        comparisons[str(files[itm]) + ' vs ' + str(files[itm+1])] = res
    except:
        pass
    try:
        res = filecmp.cmp(files[itm], files[itm+2])
        comparisons[str(files[itm]) + ' vs ' + str(files[itm+2])] = res
    except:
        pass
    try:
        res = filecmp.cmp(files[itm], files[itm+3])
        comparisons[str(files[itm]) + ' vs ' + str(files[itm+3])] = res
    except:
        pass
    try:
        res = filecmp.cmp(files[itm], files[itm+4])
        comparisons[str(files[itm]) + ' vs ' + str(files[itm+4])] = res
    except:
        pass
print(comparisons)

给予:

{'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}

至于你问题的另一部分,你可以像这样使用内置的shutilos 模块:

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 的答案修改:https://stackoverflow.com/a/748879/5247482

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')

【讨论】:

  • 它是否适用于 100 或 200 等多个文件? @乔恩
  • 是的,但是您将有 100 或 200 个单独的 try/except 语句。最好有一个递归 for 循环
  • 我会从@zalew 推荐这个答案stackoverflow.com/a/748879/5247482 ...然后您只需再写一行remove_duplicates(c:\\example\\path') ...并根据我在shutil.move(...)上方的答案编辑最后一行
  • 文件不一样,所以我必须对类似的文件进行分组。这种情况也适用吗? @stackoverflow.com/users/5247482/jon
  • 不确定您的意思。这会将文件夹中的所有文件与该文件夹中的所有其他文件进行比较,并将重复项移动到您指定的位置。
猜你喜欢
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多