2011-02-04 30 views
5

Tengo dos archivos de texto grandes, cerca de 2GB cada uno. Necesito algo como diff f1.txt f2.txt. ¿Hay alguna manera de hacer esta tarea rápido en Python? El estándar difflib es demasiado lento. Supongo que hay una manera más rápida, porque difflib está completamente implementado en Python.diff dos archivos grandes en Python

+6

¿Por qué no utilizar 'diff f1.txt f2.txt'? – delnan

+1

@delnan: porque hará que mi plataforma de script sea dependiente. Obtener diff de archivos es solo una de las otras partes del script –

+0

¿Es factible probarlo con psyco acceleration o con Unladen Swallow o PyPy build? – ncoghlan

Respuesta

4

¿Qué le parece usar difflib de forma tal que el script pueda manejar archivos grandes? No cargue los archivos en la memoria, sino itere a través de los archivos de los archivos y dif en fragmentos. Por ejemplo, 100 líneas a la vez.

import difflib 

d = difflib.Differ() 

f1 = open('bigfile1') 
f2 = open('bigfile2') 

b1 = [] 
b2 = [] 

for n, lines in enumerate(zip(f1,f2)): 
    if not (n % 100 == 0): 
     b1.append(lines[0]) 
     b2.append(lines[1]) 
    else: 
     diff = d.compare("".join(b1), "".join(b2)) 
     b1 = [] 
     b2 = [] 
     print ''.join(list(diff)) 

diff = d.compare("".join(b1), "".join(b2)) 
print ''.join(list(diff)) 
f1.close() 
f2.close() 
+1

sí, estaba intentando una secuencia de comandos similar. Demasiado lento :( –

+0

Su otra opción rápida y portátil sería pedirle a los usuarios que instalen la utilidad diff para la plataforma y luego usarla a través del wrapper de Python. –

+0

El 'difflib' de Python es lento sin importar lo que haga. Dos archivos casi idénticos de 1MB cada uno, tómeme 0.5seg en el mejor de los casos y unos minutos en el peor de los casos. La diferencia binaria toma 0.033s. – Pithikos

Cuestiones relacionadas