Detectar coincidencias en multiples archivos con Python

Hola soy nuevo programando y he estado experimentando haciendo algunos scripts que me han ayudado mucho en mi trabajo, me gustaría en este caso poder avanzar más con un script pero no encuentro manera de lograr lo que quiero hacer.

Mi script es:

with open('D:/Python/detectar_coincidencias/Emails/00AA34B3078446DB90C489BAFF37B611.MAI', 'r') as file1:
    with open('D:/Python/detectar_coincidencias/Emails/0AFA934556264ABFA0FC901F12786D29.MAI', 'r') as file2:
        same = set(file1).intersection(file2)

same.discard('\n')

with open('some_output_file.txt', 'w') as file_out:
    for line in same:
        file_out.write(line)

Esto solo me ayuda a ver dos archivos en una sola carpeta pero me gustaría que detecte la cantidad de archivos con extension .MAI que hay en esta carpeta y poder comparar estos de alguna manera y escribir las coincidencias encontradas en otro archivo nuevo.

Podrán ayudarme dándome algunas pistas o algunas soluciónes de como lograrlo?

Saludos y desde ya muchas gracias!

0
задан 29.12.2016, 17:56
0 ответов

Сохраняя твой критерий сравнения, так как не специфические больше, это мое решение:

import os
import glob
import filecmp

path = 'directorio de los archivos'
extension = '*.txt'

def comparar_linea(file1, file2):
    data1 = [line.strip() for line in file1.readlines()]
    data2 = [line.strip() for line in file2.readlines()]
    same = set(data1).intersection(data2)
    return same

def buscarCoincidencias(path, extension):
    with open('some_output_file.txt', 'w') as file_out:
        os.chdir(path)
        files = glob.glob(extension)
        for i in range(len(files)):
            for j in range(i+1, len(files)):
                with open(files[i]) as file1:
                    with open(files[j], 'r') as file2:
                        same = comparar_linea(file1, file2)
                        file_out.write(files[i] + "-"+ files[j] + ": "+str(same)+"\n")


buscarCoincidencias(path, extension)

В моем случае я имею:

test.txt:

1
2
3
4
5

test1.txt

3
4
5
6

test2.txt

2
2
3
3

some_output_file.txt:

test2.txt-test1.txt: {'3'}
test2.txt-test.txt: {'3', '2'}
test1.txt-test.txt: {'5', '4', '3'}
2
ответ дан 03.12.2019, 17:56
  • 1
    Wow, это был có я говорю, что má s он помог мне, encontré ошибка в ней перед ú ltima линия –  29.12.2016, 21:05
  • 2
    @HugoLesta какова ошибка? –  29.12.2016, 21:06
  • 3
    Wow, это был có я говорю, что má s он помог мне, encontré ошибка в ней перед ú ltima линия file_out.write (поля [i] + "-" + поля [j] z + ": " +str (same) + " \n") он quité она z для того, чтобы оно функционировало, но я есть traí do beunos результаты, я подтвердил, что для того, чтобы был менее тяжелым escaneo, я смог añ adir следующее: same.discard (' \n'), после объявляя переменную same. Спасибо! –  29.12.2016, 21:07
  • 4
    @HugoLesta перемещают ее себя z, когда он скопирует có digo:P –  29.12.2016, 21:08
  • 5
    я нажал на V правильного, надеюсь, что он подает тебя и большое спасибо из-за твоей помощи и во все demá s, что помогли мне tambié n! –  29.12.2016, 21:10

Чтобы получать все файлы с определенным расширением ты можешь использовать несколько методов. Выбор состоит в том, чтобы использовать os.listdir чтобы заносить в список все файлы и потом просачиваться по признаку endswith. Другой выбор состоит в том, чтобы использовать glob.

Относительно сравнивания их, завись от того, что ты хочешь сделать. Если то, что ты хочешь, состоит в том, чтобы получать линии, которые присутствуют во всех файлах без исключения, ты можешь использовать set.interesection как ты делаешь в твоем примере. Если ты хочешь сравнить из-за пар или другой вещи, ты был бы должен определять немного больше, как ты хочешь реализовать сравнение, чтобы мочь помогать тебе лучше.

Я оставляю тебе пример с комментариями посмотрим вот то, что ты желаешь:

import glob
import os


ruta = 'D:/Python/detectar_coincidencias/Emails'
os.chdir(ruta)

# Creamos un generador para abrir todos los archivos con extensión .MAI de la ruta
open_files = (open(file, 'r') for file in glob.glob("*.MAI"))

# Comparamos todos los archivos usando set.intersection().
## Esto nos retornará un conjuntos con las lineas PRESENTES en TODOS los archivos
same = set.intersection(*map(set, open_files))
same.discard('\n')

#Cerramos todos los archivos abiertos:
for f in open_files:
    f.close()

#Abrimos el archivo de destino y guardamos el contenido de la comparacion:
with open('some_output_file.txt', 'w') as file_out:
for line in same:
    file_out.write(line)
3
ответ дан 03.12.2019, 17:56

Привет возможное серьезное это решение

import os
import filecmp

def filtrarCoincidencias(ruta,extension):
    files=[ x for x in os.listdir(ruta) if x.endswith(extension)]
    coincidencias=[]

    for i,f1 in enumerate(files):
        for j,f2 in enumerate(files):
            if(j>i):
                if(filecmp.cmp(ruta+f1,ruta+f2)):
                    coincidencias.append((f1,f2))
    return coincidencias


for tupla in filtrarCoincidencias("/home/crack81/Escritorio/folder/",".MAI"):
    print(tupla)

В функцию filtrarCondidencias ты перемещаешь его маршрут, где находится твой файл и расширение файлов, которые ты хочешь сравнить, ты devuleve список tuplas с именами файлов, которые совпадают. Только не было бы, что ты написал совпадения в другом файле.

0
ответ дан 03.12.2019, 17:56
  • 1
    Ты повторяешь сравнения, например идешь в compara файл " l" с " m" в первой одной iteració n, но uego ты будешь сравнивать файл " m" с " l" –  29.12.2016, 20:07
  • 2
    Ademá s filecmp.cmp возврати True, если контент идентичен, и False, если существует частичное совпадение –  29.12.2016, 20:09
  • 3
    Ты прав я понял, что я только сравнил бы файлы в частности и не частично, и первое, который упоминая, достаточно добавить в if один j> i и я заношу в список что-либо подобное if (i! =j and j> i): –  29.12.2016, 20:19
  • 4
    Точный @Rene, все комментарии - это, чтобы улучшать ответ, если ты можешь размещать modificació n serí в гениальный –  29.12.2016, 20:29
  • 5
    @eyllanesc, если ahí ты считаешь это изданным. –  29.12.2016, 20:37