2012-03-16 16 views
5

Ésta es una cuestión teórica, ya que no tengo un problema real, pero tiene que preguntarse ...Python - Pequeño cambio en un archivo enorme

Si tuviera un enorme archivo de , dicen muchos conciertos de largo y quería cambiar un solo byte y sabía el desplazamiento de ese byte, ¿cómo podría hacerlo de manera eficiente? ¿Hay alguna forma de hacerlo sin tener que volver a escribir todo el archivo y solo escribir el byte único?

No veo nada en el archivo de Python que me permita escribir en un desplazamiento en particular en un archivo.

+2

http://docs.python.org/library/stdtypes.html#file.seek Usted establece la posición del cursor usando seek(), luego write(), luego flush() para guardar los cambios. – shimofuri

Respuesta

8

Mientras usted no necesita inserción o eliminar bytes, puede abrir el archivo en modo de "r+", utilizan el método seek para posicionar el objeto de archivo en el byte para cambiar y escribir un byte.

Puede ser más eficiente usar las operaciones de bajo nivel os.open, os.lseek, os.read, and os.write, que no hacen ningún almacenamiento en búfer a nivel de aplicación.

Si haces necesidad de insertar o eliminar bytes, lo siento, estás de suerte: no hay manera de hacerlo sin tener que reescribir el archivo completo (desde el punto de la primera inserción o deleción). Esta es una limitación de las API de archivos de bajo nivel POSIX (y AFAIK también Windows), no específicamente de Python.

+0

Seguramente solo necesita escribir el archivo desde el punto de edición, no el archivo completo? – Marcin

+0

Hermosa respuesta. ¡Muchas gracias! ¿Pero te refieres a reescribir "desde el primer cambio" en lugar de todo el archivo? Solo estoy haciendo referencia a tu comentario de abajo. – fthinker

+0

Sí, ambos tienen razón, estaba simplificando un poco. (La técnica estándar para reemplazar un archivo * atómicamente * implica hacer una copia completa, por lo que a menudo las personas simplemente lo hacen de todos modos.) – zwol

2

Puede buscar() en una posición y escribir un solo byte. Sobrescribirá lo que está allí, en lugar de insertar.

+0

Ah, bueno, relacionado con esto, ¿y si quisiera insertar? En cada caso (insertar/cambiar) ¿se ha reescrito todo el archivo o solo se ha escrito un solo byte? ¿O esto depende solo de los fs? – fthinker

+4

Ni Unix (incluido OSX) ni Windows (AFAIK) proporciona llamadas al sistema para insertar o eliminar bytes de un archivo grande sin volver a escribir todo el archivo desde el primer cambio. – zwol

2

Busque esa posición en el archivo y escriba un solo byte. objetos de archivo en Python tienen un método que toma en un desplazamiento desde alguna constante número entero Solicita:

seek(offset[, whence]) 

El argumento de donde es opcional y por defecto a 0 (posicionamiento archivo absoluto); otros valores son 1 (búsqueda relativa a la posición actual) y 2 (búsqueda relativa al final del archivo).

Cuestiones relacionadas