2011-02-04 5 views
5

J'ai deux gros fichiers texte, près de 2 Go chacun. J'ai besoin de quelque chose comme diff f1.txt f2.txt. Est-il possible de faire cette tâche rapidement en python? La norme difflib est trop lente. Je suppose qu'il y a un moyen plus rapide, car difflib est entièrement implémenté en Python.diff deux gros fichiers en Python

+6

Pourquoi ne pas utiliser 'diff f1.txt f2.txt'? – delnan

+1

@delnan: parce que cela rendra ma plateforme de script dépendante. Obtenir diff de fichiers est seulement l'une des autres parties du script –

+0

Est-il faisable de l'essayer avec l'accélération de psyco ou une construction de Swallow à vide ou de PyPy? – ncoghlan

Répondre

4

Que diriez-vous d'utiliser difflib de façon à ce que votre script puisse gérer de gros fichiers? Ne chargez pas les fichiers en mémoire, mais parcourez les fichiers des fichiers et diff en morceaux. Pour par exemple 100 lignes à la fois.

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

oui, j'essayais un script similaire. Trop lent :( –

+0

Votre autre option rapide et portable serait de demander aux utilisateurs d'installer l'utilitaire diff pour la plate-forme, puis l'utiliser via l'habillage python –

+0

'difflib' de Python est juste lent, peu importe ce que vous faites. 1 Mo chacun, prenez-moi 0.5sec au meilleur des cas et quelques minutes au pire des cas.Binaire diff prend 0.033s. – Pithikos

Questions connexes