He intentado escribir este pequeño script que cambiará el nombre de las extensiones de archivo por lotes. Estoy pasando tres argumentos, el directorio donde se encuentran los archivos, la extensión actual y la nueva extensión.
El error que estoy recibiendo es
python batch_file_rename_2.py c:\craig .txt .html Traceback (most recent call last): File "batch_file_rename_2.py", line 13, in os.rename(filename, newfile) WindowsError: [Error 2] The system cannot find the file specified
El codigo es
import os import sys work_dir=sys.argv[1] old_ext=sys.argv[2] new_ext=sys.argv[3] files = os.listdir(work_dir) for filename in files: file_ext = os.path.splitext(filename)[1] if old_ext == file_ext: newfile = filename.replace(old_ext, new_ext) os.rename(filename, newfile)
os.listdir
devuelve solo los nombres de archivo, no las rutas completas. Use os.path.join
para recrear la ruta correcta:
for filename in files: file_ext = os.path.splitext(filename)[1] if old_ext == file_ext: newfile = filename.replace(old_ext, new_ext) os.rename( os.path.join(work_dir, filename), os.path.join(work_dir, newfile))
Debe especificar el nombre completo cuando no está en el directorio (no está):
os.rename(os.path.join(work_dir, filename), os.path.join(work_dir, newfile))
El problema es que os.listdir
solo devuelve nombres de archivo sin ruta, debe usar la función os.path.join
para unirse a work_dir
y filename
.
Y la línea newfile = filename.replace(old_ext, new_ext)
parece muy insegura porque puede reemplazar no solo la extensión sino también algunas partes inesperadas del nombre de archivo.
Puede reemplazar la extensión de archivo de forma más segura utilizando las funciones os.path
, por ejemplo, splitext
.