¿cuál es la manera más elegante de verificar los archivos para la igualdad en Python? ¿Suma de comprobación? Bytes comparando? Los archivos Think no serán más grandes que 100-200 MBverifique los archivos para la igualdad
Respuesta
utilice hashlib para obtener el md5 de cada archivo y compare los resultados.
#! /bin/env python
import hashlib
def filemd5(filename, block_size=2**20):
f = open(filename)
md5 = hashlib.md5()
while True:
data = f.read(block_size)
if not data:
break
md5.update(data)
f.close()
return md5.digest()
if __name__ == "__main__":
a = filemd5('/home/neo/todo')
b = filemd5('/home/neo/todo2')
print(a == b)
Actualización: A partir de Python 2.1 hay un filecmp module que hace exactamente lo que quiere, y tiene métodos para comparar directorios también. nunca supe acerca de este módulo, todavía estoy aprendiendo Python mismo :-)
>>> import filecmp
>>> filecmp.cmp('undoc.rst', 'undoc.rst')
True
>>> filecmp.cmp('undoc.rst', 'index.rst')
False
Ok, esto podría necesitar dos respuestas por separado.
Si tiene que comparar muchos archivos, vaya a la suma de comprobación y guarde en caché la suma de comprobación para cada archivo. Para estar seguro, compara el byte de archivos coincidentes para byte después.
Si solo tiene dos archivos, vaya directamente para la comparación de bytes porque debe leer el archivo de todos modos para calcular la suma de comprobación.
En ambos casos, utilice el tamaño del archivo como una forma temprana de comprobar la desigualdad.
Incluso cuando se comparan varios archivos, la suma de comprobación podría ser contraproducente. Si solo quieres comprobar que 'a == b == c == d', entonces no veo el sentido. Si quiere algo como 'e in (a, b, c, d)', y luego quiere hacerlo con 'e, f, g', etc., entonces creo que la suma de comprobación comienza a pagar por sí misma. – aaronasterling
Bueno, el caso más común para comparar múltiples archivos es encontrar duplicados. Al menos, rara vez he visto la necesidad de asegurarme de que varios archivos son todos iguales. – Joey
Me gustaría hacer la suma de comprobación con MD5 (por ejemplo) en lugar de byte comaprasion más la verificación de la fecha y depende de usted necesita verificación de nombre.
¿Qué tiene que ver la fecha de un archivo con su contenido? – Joey
Checksum es una buena solución, estoy de acuerdo, pero ¿qué quiere decir decir "fechas de verificación"? –
¿No tiene que leer ambos archivos para obtener su suma de verificación de todos modos? Si es así, entonces creo que toda la suma de comprobación es agregar un riesgo de colisión. Editar: a menos que quiera comparar varios archivos como Joey acaba de decir en una respuesta. – aaronasterling
¿Qué tal desgranar a cmp
?
import commands
status, output = commands.getstatusoutput("/usr/bin/cmp file1 file2")
if (status == 0):
print "files are same"
elif (status == 1):
print "files differ"
else:
print "uh oh!"
Buena suerte en un sistema Windows ;-) – Joey
Instalar cygwin. –
No es una solución multiplataforma ... –
Antes de intentar cualquiera de las otras soluciones, es posible que desee hacer os.path.getsize(...)
en ambos archivos. Si eso difiere, no hay necesidad de comparar bytes o calcular suma de comprobación.
Por supuesto, esto solo ayuda si el tamaño del archivo no es fijo.
Ejemplo:
def foo(f1, f2):
if not os.path.getsize(f1) == os.path.getsize(f2):
return False # Or similar
... # Checksumming/byte-comparing/whatever
¿Qué hay de filecmp
módulo? Puede hacer la comparación de archivos de muchas maneras diferentes con diferentes compensaciones.
Y aún mejor, que es parte de la biblioteca estándar:
Módulo interesante, pero le da menos de lo que se pregunta en la pregunta: "devuelve verdadero si [los archivos] * parecen * iguales, de lo contrario es falso". Considero que esto significa que la comparación es aproximada. Sería interesante saber cuán aproximado es. Además, no pude encontrar cómo se puede hacer la comparación "de muchas maneras diferentes con diferentes intercambios": ¿podría profundizar en esto? – EOL
El uso de hashlib para obtener el MD5 también es 'aproximado'. La única forma de estar seguro es haciendo una comparación byte a byte. filecmp lo soporta, al pasar False a través del parámetro 'shallow'. – wump
- 1. trivia Javascript: verifique la igualdad contra el objeto vacío
- 2. verifique el contenido en los archivos .class
- 3. NumPy/SciPy: Mueva la máscara sobre la imagen y verifique la igualdad
- 4. manera adecuada para comprobar la igualdad URL
- 5. comparar arrays para la igualdad, el orden de los elementos
- 6. Uso GetHashCode para probar la igualdad de los iguales anular
- 7. Verifique la existencia de la clave YAML
- 8. Comparación de XmlDocument para la igualdad (contenido)
- 9. Scala, Java y la igualdad
- 10. la igualdad frente a la igualdad de ubicación
- 11. comprobando la igualdad de una parte de dos archivos
- 12. Smalltalk - Comparar dos cadenas para la igualdad
- 13. ¿Cómo compara HashSet elementos para la igualdad?
- 14. java.lang.Class y la igualdad
- 15. .NET objeto la igualdad
- 16. Prueba de delegados para igualdad
- 17. Lo que impide que Java verifique los archivos jar firmados con múltiples algoritmos de firma
- 18. operador de igualdad dentro de la aplicación operador de igualdad
- 19. sqlalchemy id igualdad vs igualdad de referencia
- 20. ¿Cómo anular correctamente la igualdad?
- 21. congruencia por la igualdad heterogéneo
- 22. Verifique si se proporcionó la ruta completa
- 23. SQL - crear en la columna SELECT para probar la igualdad
- 24. Verifique la existencia de archivos dev de Python desde el script bash
- 25. Comparación de dos matrices numpy para la igualdad, elemento-sabio
- 26. MethodInfo Igualdad para declarar el tipo
- 27. Cómo probar elementos de Rcpp :: CharacterVector para la igualdad?
- 28. Octave/MATLAB: ¿Cómo comparar las estructuras para la igualdad?
- 29. ¿Se pueden comparar objetos por dirección para la igualdad?
- 30. Enum boxeo y la Igualdad
¿Cuál es el propósito de realizar un hash MD5? ¿Por qué no simplemente leer los dos archivos bloque por bloque hasta que un bloque sea diferente? Esto omitiría la fase de cálculo de MD5, * y * sería robusto frente a las colisiones hash (ciertamente improbables). – EOL
@EOL tiene un punto válido allí, eso también funcionará. La única ventaja que veo es almacenar la fecha modificada del archivo hash + y volver a usar esos valores precalculados en el futuro. – invert