Читать книгу El gran libro de Python - Marco Buttu - Страница 79

La interacción con el sistema operativo

Оглавление

Nuestro script debe ser capaz de interactuar con el sistema operativo, tanto para crear el directorio de salida, en el caso en que no exista, como para buscar los archivos con extensión .data dentro del directorio de trabajo. Como ya hemos mencionado anteriormente, es el módulo os quien proporciona esta interacción. De hecho, en el script hemos utilizado la función os.mkdir() para crear los directorios de salida:


Si el directorio existe, os.mkdir() genera una excepción de tipo FileExistsError:


Por esta razón, la instrucción que contiene os.mkdir() ha sido insertada dentro de la instrucción try. Así, si el directorio ya existe, se detecta una excepción y el flujo de ejecución pasa directamente a la cláusula except, saltando la print() inmediatamente después de os.mkdir(). A este punto, la suite de la except muestra un mensaje avisando de que el directorio ya existe, y la ejecución pasa a la instrucción for.

La función os.listdir() llamada sin argumentos devuelve una lista de los nombres de archivo y directorios incluidos dentro del directorio actual:


El bucle for itera sobre la lista devuelta por os.listdir() y ejecuta acciones solo si el nombre del archivo acaba en .data. Los archivos con la extensión .data son los siguientes:


Para cada uno de ellos debe crearse un archivo de salida cuyo nombre es otorgado por:


La función os.path.join() une una o más rutas, usando como separador el propio del sistema operativo en uso, por tanto, una barra inclinada en los sistemas Unix-like:


y una barra invertida en los sistemas Windows:


En nuestro caso, la ruta final es el resultado de la unión del nombre del directorio de salida con el nombre del archivo de salida. Por ejemplo, si el nombre del directorio de salida es out_dir_name = 'outdir' y el del archivo de entrada es file_name = '20110315.data', obtenemos:


Si, en lugar de utilizar os.path.join(), hubiéramos unido las rutas insertando el separador específico de nuestro sistema operativo, el script no habría sido portable, es decir, no habríamos podido ejecutarlo del mismo modo en todos los sistemas operativo. Para entendernos, si hubiéramos creado la ruta de este modo:


utilizando el separador específico de los sistemas Windows, nuestro programa no habría funcionado correctamente en los sistemas Unix-like. Consideremos, por ejemplo, el siguiente script:


Cuando lo ejecutamos en Windows, este crea un directorio de nombre out, para crear a continuación en su interior el archivo myfile.dataout. Sin embargo, la ruta pasada a open() utiliza el separador específico de Windows, por lo que el script no es portable. De hecho, en un sistema Unix-like no se crea un archivo myfile.dataout dentro del directorio out, sino un archivo out\myfile.dataout en el directorio actual:


Es muy importante conocer el módulo os, puesto que proporciona múltiples herramientas que nos permiten escribir programas portables.

NOTA

El objeto al que hace referencia os.path es un módulo, que es distinto según el sistema operativo en uso. Por ejemplo, en los sistemas Unix-like os.path se refiere al módulo posixpath:


mientras que en los sistemas Windows se refiere al módulo ntpath:


Por tanto, si llamamos a la función os.path.join() desde un sistema Unix- like, en realidad la función que estamos llamando es posixpath.path.join(), mientras que si llamamos a os.path.join() desde un sistema Windows, estamos llamando realmente a la función ntpath.path.join().

Acabamos esta introducción al módulo os con un consejo: leed la documentación online del sitio oficial, que encontraréis en la página http://docs.python.org/3/library/ os.html.

El gran libro de Python

Подняться наверх