Introducción al módulo Python OS

En este tutorial, aprenderá a trabajar junto con el módulo os de Python. Python es uno de los lenguajes más utilizados en los últimos tiempos para diversas tareas...

En este tutorial, aprenderá a trabajar junto con el módulo os de Python.

Introducción

Python es uno de los lenguajes más utilizados en los últimos tiempos para diversas tareas, como el procesamiento de datos, el análisis de datos y la creación de sitios web. En este proceso, hay varias tareas que dependen del sistema operativo. Python permite al desarrollador usar varias funcionalidades dependientes del sistema operativo con el módulo de Python os. Este paquete abstrae las funcionalidades de la plataforma y proporciona las funciones de python para navegar, crear, eliminar y modificar archivos y carpetas. En este tutorial, uno puede esperar aprender cómo importar este paquete, sus funcionalidades básicas y un proyecto de muestra en python que usa esta biblioteca para una tarea de combinación de datos.

Algunas funciones básicas {#algunas funciones básicas}

Exploremos el módulo con un código de ejemplo.

Importar la biblioteca:

1
import os

Obtengamos la lista de métodos que podemos usar con este módulo.

1
print(dir(os))

Producción:

1
['DirEntry', 'F_OK', 'MutableMapping', 'O_APPEND', 'O_BINARY', 'O_CREAT', 'O_EXCL', 'O_NOINHERIT', 'O_RANDOM', 'O_RDONLY', 'O_RDWR', 'O_SEQUENTIAL', 'O_SHORT_LIVED', 'O_TEMPORARY', 'O_TEXT', 'O_TRUNC', 'O_WRONLY', 'P_DETACH', 'P_NOWAIT', 'P_NOWAITO', 'P_OVERLAY', 'P_WAIT', 'PathLike', 'R_OK', 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'TMP_MAX', 'W_OK', 'X_OK', '_Environ', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_execvpe', '_exists', '_exit', '_fspath', '_get_exports_list', '_putenv', '_unsetenv', '_wrap_close', 'abc', 'abort', 'access', 'altsep', 'chdir', 'chmod', 'close', 'closerange', 'cpu_count', 'curdir', 'defpath', 'device_encoding', 'devnull', 'dup', 'dup2', 'environ', 'errno', 'error', 'execl', 'execle', 'execlp', 'execlpe', 'execv', 'execve', 'execvp', 'execvpe', 'extsep', 'fdopen', 'fsdecode', 'fsencode', 'fspath', 'fstat', 'fsync', 'ftruncate', 'get_exec_path', 'get_handle_inheritable', 'get_inheritable', 'get_terminal_size', 'getcwd', 'getcwdb', 'getenv', 'getlogin', 'getpid', 'getppid', 'isatty', 'kill', 'linesep', 'link', 'listdir', 'lseek', 'lstat', 'makedirs', 'mkdir', 'name', 'open', 'pardir', 'path', 'pathsep', 'pipe', 'popen', 'putenv', 'read', 'readlink', 'remove', 'removedirs', 'rename', 'renames', 'replace', 'rmdir', 'scandir', 'sep', 'set_handle_inheritable', 'set_inheritable', 'spawnl', 'spawnle', 'spawnv', 'spawnve', 'st', 'startfile', 'stat', 'stat_float_times', 'stat_result', 'statvfs_result', 'strerror', 'supports_bytes_environ', 'supports_dir_fd', 'supports_effective_ids', 'supports_fd', 'supports_follow_symlinks', 'symlink', 'sys', 'system', 'terminal_size', 'times', 'times_result', 'truncate', 'umask', 'uname_result', 'unlink', 'urandom', 'utime', 'waitpid', 'walk', 'write']

Ahora, usando el método getcwd, ​​podemos recuperar la ruta del directorio de trabajo actual.

1
print(os.getcwd())

Producción:

1
C:\Users\hpandya\OneDrive\work\wikihtp\os_python\os_python\Project

Lista de carpetas y archivos

Let's enumerar las carpetas/archivos in the current directory using listdir:

1
print(os.listdir())

Producción:

1
['Data', 'Population_Data', 'README.md', 'tutorial.py', 'tutorial_v2.py']

Como puede ver, tengo 2 carpetas: Data y Population_Data. También tengo 3 archivos: el archivo de descuento README.md y dos archivos de Python, a saber, tutorial.py y tutorial_v2.py.

Para obtener la estructura de árbol completa de la carpeta de mi proyecto, escribamos una función y luego usemos os.walk() para iterar sobre todos los archivos en cada carpeta del directorio actual.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# function to list files in each folder of the current working directory

def list_files(startpath):
    for root, dirs, files in os.walk(startpath):
        # print(dirs)
        if dir!= '.git':
            level = root.replace(startpath, '').count(os.sep)
            indent = ' ' * 4 * (level)
            print('{}{}/'.format(indent, os.path.basename(root)))
            subindent = ' ' * 4 * (level + 1)
            for f in files:
                print('{}{}'.format(subindent, f))

Llame a esta función utilizando la ruta del directorio de trabajo actual, que vimos antes:

1
2
startpath = os.getcwd()
list_files(startpath)

Producción:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Project/
    README.md
    tutorial.py
    tutorial_v2.py
    Data/
        uscitiesv1.4.csv
    Population_Data/
        Alabama/
            Alabama_population.csv
        Alaska/
            Alaska_population.csv
        Arizona/
            Arizona_population.csv
        Arkansas/
            Arkansas_population.csv
        California/
            California_population.csv
        Colorado/
            Colorado_population.csv
        Connecticut/
            Connecticut_population.csv
        Delaware/
            Delaware_population.csv
        ...

[Nota: la salida se ha truncado por brevedad.]{.small}

Como se ve en la salida, los nombres de las carpetas terminan con un / y los archivos dentro de las carpetas tienen una sangría de cuatro espacios a la derecha. La carpeta Data tiene un archivo csv llamado uscitiesv1.4.csv. Este archivo tiene datos sobre la población de cada ciudad de los Estados Unidos. La carpeta Population_Data tiene carpetas para los estados, que contienen archivos csv separados para los datos de población de cada estado, extraídos de uscitiesv1.4.csv.

Cambiar directorio de trabajo

Cambiemos el directorio de trabajo y entremos en el directorio de datos con el estado de "Nueva York".

1
os.chdir('Population_Data/New York')

Ahora vamos a ejecutar de nuevo el método list_files, pero en este directorio.

1
list_files(os.getcwd())

Producción:

1
2
New York/
    New York_population.csv

Como puede ver, hemos ingresado a la carpeta Nueva York en la carpeta Population_Data.

Crear una estructura de directorios única y anidada

Ahora, vamos a crear un nuevo directorio llamado testdir en este directorio.

1
os.mkdir('testdir')
1
list_files(os.getcwd())

Producción:

1
2
3
New York/
    New York_population.csv
    testdir/

Como puede ver, crea el nuevo directorio en el directorio de trabajo actual.

Vamos a crear un directorio anidado con 2 niveles.

1
os.mkdir('level1dir/level2dir')

Producción:

1
2
3
4
5
6
Traceback (most recent call last):

  File "<ipython-input-12-ac5055572301>", line 1, in <module>
    os.mkdir('level1dir/level2dir')

FileNotFoundError: [WinError 3] The system cannot find the path specified: 'level1dir/level2dir'

Obtenemos un Error. Para ser específicos, obtenemos un FileNotFoundError. Quizás se pregunte por qué aparece un error FileNotFound cuando intentamos crear un directorio.

La razón: el módulo Python busca un directorio llamado level1dir para crear el directorio level2dir. Dado que level1dir no existe, en primer lugar, arroja un FileNotFoundError.

Para propósitos como este, se utiliza la función mkdirs(), que puede crear varios directorios recursivamente.

1
os.makedirs('level1dir/level2dir')

Compruebe el árbol de directorios actual,

1
list_files(os.getcwd())

Producción:

1
2
3
4
5
New York/
    New York_population.csv
    level1dir/
        level2dir/
    testdir/

Como podemos ver, ahora tenemos dos subdirectorios en la carpeta Nueva York. testdir y level1dir. level1dir tiene un directorio debajo llamado level2dir.

Eliminar directorios únicos y múltiples de forma recursiva

El módulo os también tenía métodos para modificar o eliminar directorios, que mostraré aquí.

Ahora, eliminemos los directorios que acabamos de crear usando rmdir:

1
os.rmdir('testdir')

Verifique el árbol de directorios actual para verificar que el directorio ya no existe:

1
list_files(os.getcwd())

Producción:

1
2
3
4
New York/
    New York_population.csv
    level1dir/
        level2dir/

Como puede ver, se ha eliminado testdir.

Probemos y eliminemos la estructura de directorios anidados de level1dir y level2dir.

1
os.rmdir('level1dir')

Producción:

1
2
3
4
5
6
OSError
Traceback (most recent call last)
<ipython-input-14-690e535bcf2c> in <module>()
----> 1 os.rmdir('level1dir')

OSError: [WinError 145] The directory is not empty: 'level1dir'

Como se ve, esto arroja un OSError y con razón. Dice que el directorio level1dir no está vacío. Eso es correcto porque tiene level2dir debajo.

Con el método rmdir no es posible eliminar un directorio que no esté vacío, similar a la versión de línea de comandos de Unix.

Al igual que el método makedirs(), probemos rmdirs(), que elimina directorios recursivamente en una estructura de árbol.

1
os.removedirs('level1dir/level2dir')

Veamos de nuevo la estructura del árbol de directorios:

1
list_files(os.getcwd())

Producción:

1
2
New York/
    New York_population.csv

Esto nos lleva al estado anterior del directorio.

Ejemplo con procesamiento de datos

Hasta ahora hemos explorado cómo ver, crear y eliminar una estructura de directorio anidada. Ahora veamos un ejemplo de cómo el módulo os ayuda en el procesamiento de datos.

Para eso, subamos un nivel en la estructura de directorios.

1
os.chdir('../')

Con eso, volvamos a ver la estructura del árbol de directorios.

1
list_files(os.getcwd())

Producción:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
Population_Data/
    Alabama/
        Alabama_population.csv
    Alaska/
        Alaska_population.csv
    Arizona/
        Arizona_population.csv
    Arkansas/
        Arkansas_population.csv
    California/
        California_population.csv
    Colorado/
        Colorado_population.csv
    Connecticut/
        Connecticut_population.csv
    Delaware/
        Delaware_population.csv
...

[Nota: la salida se ha truncado por brevedad.]{.small}

Combinemos los datos de todos los estados, iterando sobre el directorio de cada estado y fusionando los archivos CSV de la misma manera.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import os
import pandas as pd

# create a list to hold the data from each state
list_states = []

# iteratively loop over all the folders and add their data to the list
for root, dirs, files in os.walk(os.getcwd()):
    if files:
        list_states.append(pd.read_csv(root+'/'+files[0], index_col=None))

# merge the dataframes into a single dataframe using Pandas library
merge_data = pd.concat(list_states[1:], sort=False)

Gracias en parte al módulo os pudimos crear merge_data, que es un marco de datos que contiene datos de población de cada estado.

Conclusión

En este artículo, exploramos brevemente las diferentes capacidades del módulo integrado os de Python. También vimos un breve ejemplo de cómo se puede usar el módulo en el mundo de Data Science and Analytics. Es importante comprender que os tiene mucho más que ofrecer y, en función de la necesidad del desarrollador, se puede construir una lógica mucho más compleja.

Licensed under CC BY-NC-SA 4.0