Manejo de archivos: continuación
Dado que los problemas de portabilidad eran (y siguen siendo) muy graves, se tomó la decisión de resolver definitivamente el problema de una manera que no atraiga mucho la atención del desarrollador.
Se realizó a nivel de clases, que son responsables de leer y escribir caracteres hacia y desde el stream. Funciona de la siguiente manera:
- Cuando el stream está abierto y se recomienda que los datos en el archivo asociado se procesen como texto (o no existe tal aviso), se cambia al modo texto.
- Durante la lectura y escritura de líneas desde y hacia el archivo asociado, no ocurre nada especial en el entorno Unix, pero cuando se realizan las mismas operaciones en el entorno Windows, un proceso llamado traducción de caracteres de nueva línea ocurre: cuando lees una línea del archivo, cada par de caracteres
\r\n
se reemplaza con un solo caracter\n
, y viceversa; durante las operaciones de escritura, cada caracter\n
se reemplaza con un par de caracteres\r\n
. - El mecanismo es completamente transparente para el programa, el cual puede escribirse como si estuviera destinado a procesar archivos de texto Unix/Linux solamente; el código fuente ejecutado en un entorno Windows también funcionará correctamente.
- Cuando el stream está abierto, su contenido se toma tal cual es, sin ninguna conversión - no se agregan, ni se omiten bytes.
Abriendo los streams
El abrir un stream se realiza mediante una función que se puede invocar de la siguiente manera:
stream = open(file, mode = 'r', encoding = None)
Vamos a analizarlo:
- El nombre de la función (
open
) habla por si mismo; si la apertura es exitosa, la función devuelve un objeto stream; de lo contrario, se genera una excepción (por ejemplo, FileNotFoundError si el archivo que vas a leer no existe). - El primer parámetro de la función (
file
) especifica el nombre del archivo que se asociará al stream. - El segundo parámetro (
mode
) especifica el modo de apertura utilizado para el stream; es una cadena llena de una secuencia de caracteres, y cada uno de ellos tiene su propio significado especial (más detalles pronto). - El tercer parámetro (
encoding
) especifica el tipo de codificación (por ejemplo, UTF-8 cuando se trabaja con archivos de texto). - La apertura debe ser la primera operación realizada en el stream.
Nota: el modo y los argumentos de codificación pueden omitirse; en dado caso, se tomarán sus valores predeterminados. El modo de apertura predeterminado es leer en modo de texto, mientras que la codificación predeterminada depende de la plataforma utilizada.
Permítenos ahora presentarte los modos de apertura más importantes y útiles. ¿Listo?