Manejo de ficheros en Python

Posted on 3 min read

Abrir un fichero y leer su contenido es muy sencillo en Python. Veamos un primer ejemplo en que queremos leer un fichero de texto (.txt) localizado en el mismo directorio que el archivo Python (.py) a ejcecutar:

file = open('example.txt')
for line in file:
    print line,

La función open abre el fichero. Posteriormente recorremos las líneas del archivo de texto e imprimimos cada una de ellas, haciéndolas terminar, en este caso, sin ningún carácter.

Debe notarse la coma (,) en la sentencia print. Esto hace que se concluya la línea con un espacio en lugar de con un salto de línea. Es un comando propio de Python 2.x, que se realiza de otro modo en Python 3.x (no abordamos aquí sentencias en Python 3.x).

Podemos especificar que se trata de la lectura de un archivo añadiendo un segundo argumento a la función open:

file = open('example.txt', 'r')

donde r viene de read.  Cuando se trate de abrir un archivo para la escritura, el segundo argumento será w, de write, y cuando se trate de añadir nuevo contenido a un fichero ya existente se utilizará a, de append.

En el siguiente ejemplo vamos a abrir un archivo, leer su contenido y escribir dicho contenido en un nuevo archivo de texto:

input = open('old.txt','r')
output = open('new.txt','w')
for line in input:
    print >> output, line,

donde r viene de read.

Lo anterior es válido para ficheros de texto con un número pequeño de líneas. Para ficheros grandes el procedimiento de leer línea por línea el fichero no es operativo. Para ello debe establecerse el tamaño de un buffer de modo podamos procesar ese tamaño de información cada vez, en lugar de línea por línea. En el siguiente código establecemos el tamaño de la información a procesar (buffersize) y leemos el archivo original en secciones de ese tamaño (input.read(buffersize)). Posteriormente vamos escribiendo dichas secciones una a una en el archivo destino (output.write(buffer)) hasta llegar a un máximo para el tamaño del archivo destino (bufferlimit). En pantalla escribimos un indicador de cada paso del proceso (print”&”,).

buffersize = 100000
input = open('bigfile.txt', 'r')
output = open('newbigfile.txt', 'w')
buffer = input.read(buffersize)
bufferlimit = 1000000

while bufferlimit >0:
    output.write(buffer)
    bufferlimit = bufferlimit - buffersize
    print "&",

El mismo proceso puede realizarse sin límite en el tamaño del archivo final. En este caso la condición del bucle es len(buffer), es decir el tamaño del fichero leído y escrito en bloques de tamaño buffersize).

buffersize = 10000
input = open('bigfile.txt', 'r')
output = open('newbigfile.txt', 'w')
buffer = input.read(buffersize)

while len(buffer):
    output.write(buffer)
    print ".",
    buffer = input.read(buffersize)

Además de contenidos alfanuméricos, es posible tratar archivos con cualquier código binario, ya sean archivos de vídeo, imágenes o cualquier otra información. A continuación presentamos un ejemplo en el que leemos y escribimos una imagen. Establecemos la variable buffersize del tamaño en bits de cada paso del proceso. Al abrir los archivos de entrada y de salida especificamos que son archivos binarios mediante rb (read binary) y wb (write binary). El resto es como cualquier otro archivo.

buffersize = 10000
input = open('image_test.jpg', 'rb')
output = open('new_image_test.jpg', 'wb')
buffer = input.read(buffersize)

while len(buffer):
    output.write(buffer)
    print ".",
    buffer = input.read(buffersize)