es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Comparando dos archivos de texto dentro de archivos zip utilizando Python.

Quiero comparar dos archivos de texto con el mismo nombre y la misma ruta relativa dentro de dos archivos zip diferentes utilizando Python.

He estado intentando buscar varias formas y no he encontrado ninguna de las soluciones principales disponibles que funcione en mi caso.

Mi código:

from zipfile import ZipFile
from pathlib import Path

with ZipFile(zip_path1) as z1, ZipFile(zip_path2) as z2:
    file1_paths = [Path(filepath) for filepath in z1.namelist()]
    file2_paths = [Path(filepath) for filepath in z2.namelist()]
    cmn = list(set(file1_paths).intersection(set(file2_paths)))
    common_files = [filepath for filepath in cmn if str(filepath).endswith(('.txt', '.sh'))]

    for f in common_files:
        with z1.open(f, 'r') as f1, z2.open(f, 'r') as f2:
            if f1.read() != f2.read():
                print('Diferencia encontrada en {filepath}'.format(filepath=str(f)))

Nota:

He utilizado pathlib para las rutas aquí. En la línea with z1.open(f, 'r')... si uso rutas de pathlib en lugar de codificar la ruta, obtengo el error “No hay ningún elemento llamado WindowsPath(‘SomeFolder/somefile.txt’) en el archivo”.

Además, incluso si codifico la ruta, el búfer de lectura del archivo que se utiliza para la comparación siempre viene vacío. Por lo tanto, la comparación no funciona en realidad en este caso.

Estoy atrapado en este caso curioso y cualquier ayuda es muy apreciada.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución para comparar dos archivos de texto con el mismo nombre y la misma ruta relativa dentro de dos archivos zip diferentes usando Python

    Para comparar dos archivos de texto con el mismo nombre y ruta relativa dentro de dos archivos zip diferentes utilizando Python, se pueden seguir los siguientes pasos:

    1. Importar las bibliotecas necesarias, es decir, zipfile y pathlib.
       from zipfile import ZipFile
       from pathlib import Path
    
    1. Abrir ambos archivos zip utilizando la función ZipFile() y almacenarlos en variables, por ejemplo, z1 y z2.
       with ZipFile(ruta_zip1) as z1, ZipFile(ruta_zip2) as z2:
    
    1. Crear dos listas de rutas de archivos para ambos archivos zip utilizando el método namelist() y la función Path().
       rutas_archivo1 = [Path(ruta_archivo) for ruta_archivo in z1.namelist()]
       rutas_archivo2 = [Path(ruta_archivo) for ruta_archivo in z2.namelist()]
    
    1. Encontrar los archivos comunes de ambas listas utilizando el método intersection() y almacenarlos en una nueva lista llamada cmn.
       cmn = list(set(rutas_archivo1).intersection(set(rutas_archivo2)))
    
    1. Crear otra lista de archivos comunes a partir de la lista cmn filtrando los archivos que no terminan con .txt o .sh.
       archivos_comunes = [ruta_archivo for ruta_archivo in cmn if str(ruta_archivo).endswith(('.txt', '.sh'))]
    
    1. Iterar sobre la lista de archivos comunes y abrir cada archivo en ambos archivos zip utilizando el método open() y comparar su contenido utilizando el método read().
       for archivo in archivos_comunes:
           with z1.open(str(archivo), 'r') as f1, z2.open(str(archivo), 'r') as f2:
               if f1.read() != f2.read():
                   print('Se encontró una diferencia en {ruta_archivo}'.format(ruta_archivo=str(archivo)))
    

    Nota: Es importante convertir los objetos Path a objetos str utilizando la función str(), ya que el método open() espera objetos str como entrada.

    La solución anterior debería ser capaz de comparar dos archivos de texto con el mismo nombre y ruta relativa dentro de dos archivos zip diferentes utilizando Python.

Comments are closed.