Abriendo ficheros en varios modos
Los ficheros se pueden abrir en varios modos:
- Modo de lectura (r). Sólo se pueden leer los datos.
- Modo de escritura (w). Sólo se escriben datos, pero se borra lo anterior que estuviera escrito.
- Modo de añadir datos (a). Se escriben datos, añadiéndolos a los anteriores, al final del fichero.
- Si se añade a cualquiera de los anteriores un signo "+" (r+, w+, a+) se obtiene un modo doble de lectura - escritura. Pero hay que tener en cuenta que no son iguales. Usar w+ implicaría también que al escribir datos se borren los datos anteriores.
- Si en modo lectura se intenta abrir un archivo inexistente, se generará un error.
- Si en modo w o a se abre un archivo inexistente, se creará.
- Si no se especifica el modo, por defecto se abren en modo de sólo lectura (r).
- archivo.write("Esto se guarda"), para escribir una cadena o...
- archivo.writelines(lista_de_cadenas), para escribir una lista de cadenas.
# -*- coding: utf-8 -*- archivo = open("numeros.txt", "w") for i in range(50): # genera números pares archivo.write(str((i+1)*2)+"\n") archivo.close() # cierra el archivo # lo abre otra vez en modo añadir y lectura archivo = open("numeros.txt", "a+") for i in range(50): # genera números impares archivo.write(str((i+1)*2-1)+"\n") archivo.close() archivo = open("numeros.txt", "a+") i=1 for linea in archivo: linea = linea.rstrip("\n") print ("%d: %s") % (i, linea) i += 1 archivo.close()
===
Si eres observador, habrás notado que he abierto dos veces el archivo en modo a+... ¿por qué? ¿Por qué no poner el código de lectura a continuación del de escritura? Puedo hacerlo, pero antes hay que indicarle al archivo que apunte a la primera dirección del fichero. Si no, tendrá un funcionamiento incorrecto.
# -*- coding: utf-8 -*- archivo = open("numeros.txt", "w") for i in range(50): # genera números pares archivo.write(str((i+1)*2)+"\n") archivo.close() # cierra el archivo # lo abre otra vez en modo añadir y lectura archivo = open("numeros.txt", "a+") for i in range(50): # genera números impares archivo.write(str((i+1)*2-1)+"\n") archivo.seek(0) #apunta el fichero a la primera línea i=1 for linea in archivo: linea = linea.rstrip("\n") print ("%d: %s") % (i, linea) i += 1 archivo.close()
= = =
Archivos binarios
Los
ficheros suelen contener información en caracteres alfanuméricos o de
cadena, pero también pueden ser ficheros binarios. La información se
guarda directamente en bytes.
Los modos anteriormente escritos son válidos, agregando la letra b al parámetro de modo (rb, ab, wb...) aunque pueda funcionar sin agregar el parámetro en intérpretes modernos.
Las funciones a usar con archivos binarios son:
- contenido = archivo.read(n) , para leer n bytes.
- archivo.write(contenido), escribe en la posición actual.
- archivo.tell(), posición actual
- archivo.seek(inicio, desde), posiciona el puntero en el archivo. Inicio, la cantidad de bytes a desplazar, desde puede ser al principio, al final o la posición actual.
Otros métodos
- archivo.name, retorna el nombre del fichero actual.
- archivo.mode, el modo en el que fue abierto
- archivo.encoding, la codificación de caracteres usada.
= = =
Ejemplo: Guarda la siguiente imagen png en la carpeta donde guardas los programas. Nombre coche.png.
![coche_png](http://192.168.0.5/moodle28/pluginfile.php/2010/mod_page/content/18/coche.png)
Bien. Ahora ejecuta el siguiente
programa. La línea en la que se lee cada byte del fichero puede
convertirse o no a su número de orden ASCII o directamente a su código.
Comenta / descomenta en cada caso.
# -*- coding: utf-8 -*- imagen = open("coche.png", "rb") print imagen.name print imagen.mode print imagen.encoding print imagen.tell() data = imagen.read() print len(data) imagen.seek(0) lista = [] for i in range(len(data)): # lista.append(imagen.read(1)) lista.append(ord(imagen.read(1))) print lista print len(lista) print "terminó fichero" imagen.close()
= = =
Aunque no saldrá ninguna imagen coherente, intenta generar esta foto de prueba en formato bmp.
# -*- coding: utf-8 -*- import random imagen = open("prueba.bmp", "wb") lista = [] for i in range(1000): lista.append(random.randrange(0,256)) imagen.write(str(lista[i])) print lista imagen.close()
No hay comentarios:
Publicar un comentario