Introducción
Contenido
Python es uno de los lenguajes más utilizados en los últimos tiempos para diversas tareas como procesamiento de datos, análisis de datos y 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 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 fusión de datos.
Algunas funciones básicas
Exploremos el módulo con un código de ejemplo.
Importar la biblioteca:
import os
Consigamos la lista de métodos que podemos usar con este módulo.
print(dir(os))
Salida:
['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 getcwd
método, podemos recuperar la ruta del directorio de trabajo actual.
print(os.getcwd())
Salida:
C:UsershpandyaOneDriveworkPharos.shos_pythonos_pythonProject
Enumerar carpetas y archivos
Hagamos una lista de las carpetas / archivos en el directorio actual usando listdir
:
print(os.listdir())
Salida:
['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: README.md
archivo de rebajas 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.
# 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 usando la ruta del directorio de trabajo actual, que vimos cómo hacer antes:
startpath = os.getcwd()
list_files(startpath)
Salida:
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.
Como se ve en la salida, los nombres de las carpetas terminan con un /
y los archivos dentro de las carpetas se han sangrado cuatro espacios a la derecha. los Data
la carpeta 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».
Te puede interesar:Introducción a Python FTPos.chdir('Population_Data/New York')
Ahora ejecutemos el list_files
método de nuevo, pero en este directorio.
list_files(os.getcwd())
Salida:
New York/
New York_population.csv
Como puede ver, hemos entrado en el New York
carpeta debajo Population_Data
carpeta.
Crear una estructura de directorio única y anidada
Ahora, creemos un nuevo directorio llamado testdir
en este directorio.
os.mkdir('testdir')
list_files(os.getcwd())
Salida:
New York/
New York_population.csv
testdir/
Como puede ver, crea el nuevo directorio en el directorio de trabajo actual.
Creemos un directorio anidado con 2 niveles.
os.mkdir('level1dir/level2dir')
Salida:
Te puede interesar:Python para PNL: tokenización, derivación y lematización con la biblioteca SpaCyTraceback (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'
Recibimos un error. Para ser específicos, obtenemos un FileNotFoundError
. Podrías preguntarte por qué un FileNotFound
error cuando intentamos crear un directorio.
La razón: el módulo de Python busca un directorio llamado level1dir
para crear el directorio level2dir
. Ya que level1dir
no existe, en primer lugar, lanza un FileNotFoundError
.
Para propósitos como este, el mkdirs()
En su lugar, se utiliza la función, que puede crear varios directorios de forma recursiva.
os.makedirs('level1dir/level2dir')
Verifique el árbol de directorios actual,
list_files(os.getcwd())
Salida:
New York/
New York_population.csv
level1dir/
level2dir/
testdir/
Como podemos ver, ahora tenemos dos subdirectorios bajo New York
carpeta. testdir
y level1dir
. level1dir
tiene un directorio debajo llamado level2dir
.
Eliminar directorios únicos y múltiples de forma recursiva
los os
El módulo también tenía métodos para modificar o eliminar directorios, que mostraré aquí.
Ahora, eliminemos los directorios que acabamos de crear usando rmdir
:
os.rmdir('testdir')
Verifique el árbol de directorios actual para verificar que el directorio ya no existe:
list_files(os.getcwd())
Salida:
New York/
New York_population.csv
level1dir/
level2dir/
Como se puede ver, testdir
ha sido eliminado.
Intentemos eliminar la estructura de directorios anidada de level1dir
y level2dir
.
os.rmdir('level1dir')
Salida:
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 level1dir
el directorio no está vacío. Eso es correcto porque tiene level2dir
debajo de ello.
Con el rmdir
método no es posible eliminar un directorio que no esté vacío, similar a la versión de línea de comandos de Unix.
Como el makedirs()
método, intentemos rmdirs()
, que elimina directorios de forma recursiva en una estructura de árbol.
os.removedirs('level1dir/level2dir')
Veamos de nuevo la estructura del árbol de directorios:
list_files(os.getcwd())
Salida:
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 os
El módulo ayuda en el procesamiento de datos.
Para eso vamos a subir un nivel en la estructura de directorios.
os.chdir('../')
Con eso, veamos nuevamente la estructura del árbol de directorios.
list_files(os.getcwd())
Salida:
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.
Te puede interesar:Python: compruebe si la variable es un númeroCombinemos los datos de todos los estados, iterando sobre el directorio de cada estado y fusionando los archivos CSV de la misma manera.
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+"https://Pharos.sh.com/"+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 os
módulo que 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 diferentes capacidades de las funciones integradas de Python os
módulo. También vimos un breve ejemplo de cómo se puede utilizar el módulo en el mundo de la ciencia de datos y el análisis. Es importante entender 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.