2009-12-16 17 views
6

Supongamos que tengo un programa A. Lo ejecuto y realizo algunas operaciones a partir de un archivo foo.txt. Ahora termina A.biblioteca de Python para detectar si un archivo ha cambiado entre diferentes ejecuciones?

Nueva ejecución de A. Comprueba si el archivo foo.txt ha cambiado. Si el archivo ha cambiado, A ejecuta su operación nuevamente; de ​​lo contrario, se cierra.

¿Existe una función de biblioteca/biblioteca externa para esto?

Por supuesto, se puede implementar con md5 + un archivo/db que contenga el md5. Quiero evitar reinventar la rueda.

Respuesta

7

Es poco probable que alguien haya hecho una biblioteca por algo tan simple. Solución en 13 líneas:

import pickle 
import md5 
try: 
    l = pickle.load(open("db")) 
except IOError: 
    l = [] 
db = dict(l) 
path = "/etc/hosts" 
checksum = md5.md5(open(path).read()) 
if db.get(path, None) != checksum: 
    print "file changed" 
    db[path] = checksum 
pickle.dump(db.items(), open("db", "w") 
+2

Probablemente valga la pena revisar primero st_mtime y st_size: si han cambiado, no necesita suma de comprobación, ahorrando tiempo. –

+1

Se podrían hacer varias cosas para que sea una solución configurable/única para todos como usted desee. Mi punto es simplemente que es un problema fácil, y se necesitará más tiempo para buscar y configurar una biblioteca de casos generales que para hacer tu propia. – Sufian

+1

Hay muchas funcionalidades simples en la biblioteca estándar que se resuelven con unas pocas líneas de código, pero ahí están :) ¡Gracias por el código! –

0

No podemos verificar la última fecha de modificación. es decir, después de la primera operación almacenamos la última fecha de modificación en el archivo db, y luego, antes de volver a ejecutar, comparamos la última fecha de modificación del archivo foo.txt con el valor almacenado en nuestro db .. si difieren, realizamos la operación nuevamente ?

+0

Eso es lo que hace la marca, y francamente prefiero no hacerlo. –

+0

¿Cuál es el problema con el tiempo de modificación? –

+0

supongamos que el archivo se descarga cada hora desde un sitio web remoto, o generado a partir de cualquier fuente que realmente recrea el archivo y que está fuera de mi control. El tiempo de modificación cambiará, pero si el contenido real es el mismo, no tiene sentido volver a ejecutar la tarea. –

2

Esta es una de las cosas que es tan trivial de implementar y tan específica de la aplicación que realmente no habría ningún punto en una biblioteca, y cualquier biblioteca destinada para este propósito se volvería tan difícil de tratar de adaptarse a las muchas variaciones requeridas, aprender y usar la biblioteca tomaría tanto tiempo como implementarlo usted mismo.

4

FYI - para aquellos que utilizan este ejemplo que consiguió este error: "TypeError: no pueden salmuera HASH objetos" Simplemente modifique la siguiente (actualizar opcionalmente MD5 para hashlib, MD5 está en desuso) :

import pickle 
    import hashlib #instead of md5 
    try: 
     l = pickle.load(open("db")) 
    except IOError: 
     l = [] 
    db = dict(l) 
    path = "/etc/hosts" 
    #this converts the hash to text 
    checksum = hashlib.md5(open(path).read()).hexdigest() 
    if db.get(path, None) != checksum: 
     print "file changed" 
     db[path] = checksum 
    pickle.dump(db.items(), open("db", "w")) 

por lo que sólo cambiar:

checksum = hashlib.md5(open(path).read()) 

a

checksum = hashlib.md5(open(path).read()).hexdigest() 
Cuestiones relacionadas