Translate

domingo, 29 de noviembre de 2020

Función Open de Python


Open abre un archivo. Bastante simple, ¿eh? La mayoría de las veces, vemos que se usa así:

f = open('photo.jpg', 'r+')

jpgdata = f.read()

f.close()

El valor de retorno de open es un identificador de archivo, dado desde el sistema operativo. 

Llamar explícitamente a close cierra el archivo, pero solo si la lectura fue exitosa. Si hay algún error justo después de f = open (...), no se llamará a f.close (). Para asegurarse de que el archivo se cierre ya sea que ocurra una excepción o no, podemos usar with:

with open('photo.jpg', 'r+') as f:

    jpgdata = f.read()

El primer argumento de abrir es el nombre del archivo. El segundo (el modo) determina cómo se abre el archivo.

Si desea leer el archivo, pase r

Si desea leer y escribir el archivo, pase r +

Si desea sobrescribir el archivo, pase w

Si desea agregar al archivo, pase a

El modo es importante no solo porque cambia el comportamiento, sino también porque puede resultar en errores de permisos. Por ejemplo, si abriéramos un archivo jpg en un directorio protegido contra escritura, abrir (.., 'r +') fallaría. El modo puede contener un carácter más; podemos abrir el archivo en binario (obtendrás una cadena de bytes) o en modo texto (una cadena de caracteres).

En general, si el formato está escrito por humanos, suele ser en modo texto. Los archivos de imagen jpg generalmente no están escritos por humanos (y de hecho no son legibles por humanos) y, por lo tanto, debe abrirlos en modo binario agregando ab a la cadena de modo (si está siguiendo el ejemplo de apertura, el modo correcto sería rb). Si abre algo en modo texto (es decir, agrega una t, o nada aparte de r / r + / w / a), también debe saber qué codificación usar. Para una computadora, todos los archivos son solo bytes, no caracteres.

Desafortunadamente, open no permite la especificación de codificación explícita en Python 2.x. Sin embargo, la función io.open está disponible tanto en Python 2.x y 3.x (donde es un alias de open) y hace lo correcto. Puede pasar la codificación con la palabra clave de codificación. Si no pasa ninguna codificación, se elegirá un sistema (y Python) predeterminado específico. Puede tener la tentación de confiar en estos valores predeterminados, pero los valores predeterminados a menudo son incorrectos o la codificación predeterminada no puede expresar todos los caracteres en el archivo (esto sucederá a menudo en Python 2.x y/o Windows). Así que adelante, elija una codificación. La codificación es la forma de instruir a las computadoras sobre cómo se deben almacenar los números como bytes en la memoria. utf-8 es excelente y es compatible con los principales navegadores y lenguajes de programación. Cuando escribe un archivo, puede elegir la codificación a su gusto (o al gusto del programa que eventualmente leerá su archivo).

¿Cómo averigua en qué codificación se escribió un archivo que está leyendo? Bueno, desafortunadamente, no existe una forma infalible de detectar la codificación: los mismos bytes pueden representar caracteres diferentes pero igualmente válidos en diferentes codificaciones. Por lo tanto, debe confiar en los metadatos (por ejemplo, en los encabezados HTTP) para conocer la codificación. Cada vez más, los formatos solo definen la codificación como UTF-8.

Armados con este conocimiento, escribamos un programa que lea un archivo, determine si es JPG (pista: estos archivos comienzan con los bytes FF D8) y escriba un archivo de texto que describa el archivo de entrada.

import io

with open('photo.jpg', 'rb') as inf:

    jpgdata = inf.read()


if jpgdata.startswith(b'\xff\xd8'):

    text = u'This is a JPEG file (%d bytes long)\n'

else:

    text = u'This is a random file (%d bytes long)\n'


with io.open('summary.txt', 'w', encoding='utf-8') as outf:

    outf.write(text % len(jpgdata))


Y listo!