Cómo comprobar si un archivo es escribible en Python

PythonPythonBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderás cómo verificar si un archivo es escribible en Python. El laboratorio se centra en comprender los permisos de escritura de archivos en un entorno Linux y demuestra dos métodos para verificar el acceso de escritura.

Primero, explorarás los permisos de archivos de Linux, incluyendo los conceptos de propietario, grupo y otros, junto con los permisos de lectura, escritura y ejecución. Crearás un archivo, examinarás sus permisos predeterminados utilizando ls -l e interpretarás la salida. Luego, aprenderás cómo usar os.access() con os.W_OK e intentarás abrir el archivo para escritura para determinar su capacidad de escritura en Python.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/PythonStandardLibraryGroup(["Python Standard Library"]) python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/ErrorandExceptionHandlingGroup(["Error and Exception Handling"]) python(("Python")) -.-> python/FileHandlingGroup(["File Handling"]) python/FunctionsGroup -.-> python/build_in_functions("Build-in Functions") python/ErrorandExceptionHandlingGroup -.-> python/catching_exceptions("Catching Exceptions") python/FileHandlingGroup -.-> python/file_opening_closing("Opening and Closing Files") python/FileHandlingGroup -.-> python/file_reading_writing("Reading and Writing Files") python/FileHandlingGroup -.-> python/file_operations("File Operations") python/PythonStandardLibraryGroup -.-> python/os_system("Operating System and System") subgraph Lab Skills python/build_in_functions -.-> lab-559514{{"Cómo comprobar si un archivo es escribible en Python"}} python/catching_exceptions -.-> lab-559514{{"Cómo comprobar si un archivo es escribible en Python"}} python/file_opening_closing -.-> lab-559514{{"Cómo comprobar si un archivo es escribible en Python"}} python/file_reading_writing -.-> lab-559514{{"Cómo comprobar si un archivo es escribible en Python"}} python/file_operations -.-> lab-559514{{"Cómo comprobar si un archivo es escribible en Python"}} python/os_system -.-> lab-559514{{"Cómo comprobar si un archivo es escribible en Python"}} end

Aprende sobre permisos de escritura

En este paso, exploraremos el concepto de permisos de escritura en el entorno Linux. Comprender los permisos de archivos es crucial para controlar el acceso a tus archivos y directorios. El permiso de escritura, específicamente, determina si puedes modificar un archivo o directorio.

En Linux, cada archivo y directorio tiene un conjunto de permisos para tres categorías de usuarios:

  • Propietario (Owner): El usuario que es dueño del archivo o directorio.
  • Grupo (Group): El grupo al que pertenece el archivo o directorio.
  • Otros (Others): Todos los demás usuarios del sistema.

Para cada categoría, hay tres tipos de permisos:

  • Lectura (Read - r): Permite ver el contenido de un archivo o listar el contenido de un directorio.
  • Escritura (Write - w): Permite modificar un archivo o crear, eliminar o renombrar archivos dentro de un directorio.
  • Ejecución (Execute - x): Permite ejecutar un archivo (si es un programa) o entrar en un directorio.

Comencemos creando un archivo y examinando sus permisos predeterminados. Abre el editor VS Code y crea un nuevo archivo llamado my_file.txt en el directorio ~/project. Puedes dejar el archivo vacío por ahora.

A continuación, abre la terminal y navega hasta el directorio ~/project:

cd ~/project

Ahora, usemos el comando ls -l para ver los permisos del archivo:

ls -l my_file.txt

Verás una salida similar a esta:

-rw-rw-r-- 1 labex labex 0 Oct 26 14:35 my_file.txt

Desglosemos esta salida:

  • El primer carácter (-) indica que se trata de un archivo (a diferencia de un directorio, que sería d).
  • Los siguientes nueve caracteres (rw-rw-r--) representan los permisos.
    • Los primeros tres (rw-) son los permisos del propietario (lectura y escritura).
    • Los siguientes tres (rw-) son los permisos del grupo (lectura y escritura).
    • Los últimos tres (r--) son los permisos para los demás (solo lectura).
  • 1 indica el número de enlaces duros al archivo.
  • labex labex son los nombres del propietario y del grupo, respectivamente.
  • 0 es el tamaño del archivo en bytes.
  • Oct 26 14:35 es la marca de tiempo de la última modificación.
  • my_file.txt es el nombre del archivo.

Actualmente, el propietario (tú, como labex) y el grupo tienen permisos de lectura y escritura, mientras que los demás tienen solo permiso de lectura. Esto significa que puedes modificar el archivo, pero otros usuarios del sistema solo pueden verlo.

Ahora, intentemos eliminar el permiso de escritura para el propietario usando el comando chmod. chmod se utiliza para cambiar los permisos de los archivos.

chmod u-w my_file.txt

Aquí, u-w significa "eliminar el permiso de escritura para el propietario".

Ahora, comprobemos los permisos nuevamente:

ls -l my_file.txt

La salida ahora debería verse así:

-r--rw-r-- 1 labex labex 0 Oct 26 14:35 my_file.txt

Observa que los permisos del propietario ahora son r--, lo que indica acceso solo de lectura.

En los siguientes pasos, veremos cómo usar Python para verificar los permisos de escritura y manejar situaciones en las que no están disponibles.

Utiliza os.access() con os.W_OK

En el paso anterior, aprendimos sobre los permisos de archivos y cómo modificarlos utilizando el comando chmod. Ahora, exploremos cómo usar Python para verificar de forma programática si un archivo tiene permisos de escritura. La función os.access(), junto con la constante os.W_OK, nos permite hacer precisamente eso.

La función os.access() toma dos argumentos:

  • path: La ruta al archivo o directorio que deseas verificar.
  • mode: Un entero que representa el/los permiso(s) que deseas verificar.

La constante os.W_OK representa el permiso de escritura. Cuando se utiliza con os.access(), verifica si el archivo o directorio especificado es escribible por el usuario actual.

Creemos un script de Python para demostrar esto. Abre el editor VS Code y crea un nuevo archivo llamado check_write_permission.py en el directorio ~/project.

Agrega el siguiente código al archivo:

import os

file_path = "my_file.txt"

if os.access(file_path, os.W_OK):
    print(f"The file '{file_path}' is writable.")
else:
    print(f"The file '{file_path}' is not writable.")

Esto es lo que hace el código:

  1. Importa el módulo os, que proporciona funciones para interactuar con el sistema operativo.
  2. Define una variable file_path que almacena el nombre del archivo que queremos verificar (que es my_file.txt creado en el paso anterior).
  3. Utiliza os.access(file_path, os.W_OK) para verificar si el archivo es escribible.
  4. Imprime un mensaje que indica si el archivo es escribible o no.

Ahora, ejecutemos el script. Abre la terminal y navega hasta el directorio ~/project (si no estás ya allí):

cd ~/project

Luego, ejecuta el script de Python:

python check_write_permission.py

Dado que eliminamos los permisos de escritura para el propietario en el paso anterior, la salida debe ser:

The file 'my_file.txt' is not writable.

Ahora, demos de nuevo al propietario los permisos de escritura para el archivo:

chmod u+w my_file.txt

Y ejecutemos el script de Python nuevamente:

python check_write_permission.py

Esta vez, la salida debe ser:

The file 'my_file.txt' is writable.

Esto demuestra cómo se puede utilizar os.access() y os.W_OK para verificar de forma programática los permisos de escritura en Python. Esto es útil para escribir programas que necesitan modificar archivos, pero primero deben asegurarse de tener los permisos necesarios.

Intentar abrir un archivo para escritura

En este paso, veremos qué sucede cuando intentamos abrir un archivo para escritura sin tener los permisos necesarios. Esto nos ayudará a entender cómo Python maneja los errores de permisos.

Primero, eliminemos nuevamente el permiso de escritura de my_file.txt:

chmod u-w my_file.txt

Ahora, creemos un script de Python que intente abrir el archivo para escritura. Abre el editor VS Code y crea un nuevo archivo llamado attempt_write.py en el directorio ~/project.

Agrega el siguiente código al archivo:

file_path = "my_file.txt"

try:
    with open(file_path, "w") as f:
        f.write("This is a test.")
    print("File written successfully.")
except Exception as e:
    print(f"Error writing to file: {e}")

Esto es lo que hace el código:

  1. Define una variable file_path que almacena el nombre del archivo al que queremos escribir.
  2. Utiliza un bloque try...except para manejar posibles errores.
  3. Dentro del bloque try, intenta abrir el archivo en modo escritura ("w").
  4. Si el archivo se abre correctamente, escribe la cadena "This is a test." en el archivo.
  5. Si ocurre un error (por ejemplo, debido a la falta de permisos de escritura), el bloque except captura la excepción y muestra un mensaje de error.

Ahora, ejecutemos el script:

python attempt_write.py

Dado que eliminamos los permisos de escritura, deberías ver una salida similar a esta:

Error writing to file: [Errno 13] Permission denied: 'my_file.txt'

Esto confirma que Python genera un PermissionError (específicamente, Errno 13) cuando intentamos abrir un archivo para escritura sin los permisos necesarios.

Ahora, restaurémos los permisos de escritura:

chmod u+w my_file.txt

Y ejecutemos el script nuevamente:

python attempt_write.py

Esta vez, la salida debería ser:

File written successfully.

Y si revisas el contenido de my_file.txt, verás que ahora contiene el texto "This is a test.":

cat my_file.txt
This is a test.

Esto demuestra cómo Python maneja los errores de permisos al intentar abrir un archivo para escritura. Es importante utilizar bloques try...except para capturar estos errores y manejarlos adecuadamente en tus programas.

Resumen

En este laboratorio, comenzamos explorando el concepto de permisos de escritura en Linux, comprendiendo que estos permisos controlan la capacidad de modificar archivos y directorios. Aprendimos sobre las tres categorías de usuarios (propietario, grupo, otros) y los tres tipos de permisos (lectura, escritura, ejecución).

Luego, creamos un archivo llamado my_file.txt y utilizamos el comando ls -l para examinar sus permisos predeterminados, analizando la salida para entender cómo se representan los permisos para cada categoría de usuario. Esto proporcionó una base para comprender cómo verificar de forma programática los permisos de escritura en Python.