[Python] Empezando a programar scripts

alfema

Hace tiempo que me viene rondando la cabeza meterme con Python para hacer pequeños scripts en Linux, normalmente uso bash, quizás lo que quiero se puede hacer con él, con un poco más de trabajo.

Yendo al grano, quiero renombrar una serie de ficheros en varios directorios, no tienen todos el mismo patrón de nombres, algunas cosas, como eliminar textos o cambiarlos por otros se pueden hacer perfectamente con un renombrador de ficheros manualmente, como Bulky que viene con Linux Mint, pero no quiero repetir lo mismo en uno y otro directorio y además me llevaría más tiempo, también podría hacerlo perfectamente en bash con expresiones regulares.

La primera en la frente, hago pruebas desde el entorno de python3, pero en el script se me olvida poner la línea #!/usr/bin/python3, que sí tenía en uno de prueba, la segunda es que escribo path en vez de Path en from pathlib import Path y no, no le gusta a Python, es cuestión de acostumbrarse.

Normalmente veo el manual o la lista de comandos y forma de funcionamiento en la página oficial, me leo lo básico, sintaxis, variables y voy buscando los comandos que me hacen falta, he mirado en la página oficial y en w3schools básicamente, además de buscar en páginas diversas, quizás no es la mejor forma de aprender, pero para lo que quiero me llega.

Para listar directorios he visto que hay unas cuantas opciones, listdir, pathlib con path y scandir, al final opté por pahlib, me pareció la manera más sencilla, así que de momento ha quedado:

#!/usr/bin/python3

from pathlib import Path
import re

# Especifica el directorio que deseas leer
directorio = Path('/ruta/al/directorio')

# Listar todos los ficheros en el directorio
ficheros = [f for f in directorio.iterdir() if f.is_file() and f.name.endswith(".foo")]

for fichero in ficheros:
    # Limpia el nombre del fichero, quita las cadenas
    CR = re.compile("foo1|foo2|\foo3", re.IGNORECASE)
    NuevoFichero = CR.sub("", fichero.name)

# Las cambia
CR = re.compile("foo4|foo5", re.IGNORECASE)
NuevoFichero = CR.sub(", ", NuevoFichero)

#Cambia los puntos de la fecha por guiones
NuevoFichero = NuevoFichero.replace(".","-",2)

#Cambia el punto detrás de la fecha por un guión con espacios a la izquierda y derecha
NuevoFichero = NuevoFichero.replace("."," - ",1)

#Cambia el resto de puntos por espacios
NuevoFichero = NuevoFichero.replace("."," ")

#Cambia iniciales a mayusculas
NuevoFichero = NuevoFichero.title()

print(NuevoFichero)

En la comprobación ha ido bien, ahora sólo me falta el renombrado.

Este directorio ha sido sencillo, hay otros con más complicaciones, quizás tenga que separar las diferentes partes del fichero para interactuar con cada una de ellas para después unirlas en el orden adecuado.

No he visto ningún hilo oficial o general sobre python, salvo que esté camuflado en algún hilo con nombre raro, no estaría de más con consejos, manuales a los que acudir, páginas de referencia, ...

Zireael

Hola!

Ánimo con el aprendizaje.

El hilo oficial está aquí: https://www.mediavida.com/foro/dev/python-hilo-general-551473

1 1 respuesta
alfema

#2 gracias por el aviso, había buscado primero, pero no lo vi, aparece en la segunda página.

desu

Si quieres hacer cosas de "os" xq no usar https://docs.python.org/3/library/os.html?

with os.scandir(path) as it:
    for entry in it:
        if not entry.name.startswith('.') and entry.is_file():
            print(entry.name)
os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
os.path.split(path)

Luego no hace falta, yo lo veo bien como lo haces, pero podrias hacer todo en una regex substitution:

import re

text = "2025.01.09.data.txt"
result = re.sub(r'(\d+)\.(\d+)\.(\d+)\.(.*)', r'\1-\2-\3 - \4', text)
print(result)

Y te dara:

2025-01-09 - data.txt

Asi puedes tener una regex por caso de uso y tenerlo con tests unitarios por si nunca falla algo.

1 respuesta
alfema

#4 gracias por tu aportación, como ya comenté ví varias formas de recorrer un directorio y path me pareció la más sencilla, tengo que ver las diferencias entre un sistema u otro, si las hay además de la sintaxis, más rapidez, menos carga de trabajo, ... todavía estoy tomando contacto con el lenguaje, supongo que iré aprendiendo y mejorando a medida que vaya necesitando hacer cosas nuevas.

Muy buena la expresión regular, normalmente empiezo por resultados sencillos que voy mejorando a medida que voy conociendo más el lenguaje, le voy a dar una vuelta por si puedo añadir un par de expresiones que se me quedaron en el tintero.

Aunque me lo imagino lo que hacen, tengo que ver los de os.rename y os.path.split, ya iré contando mejoras o nuevas cosas por hacer.

Usuarios habituales

  • alfema
  • desu
  • Zireael