Tener problemas con los argumentos

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 .