Error de Windows: El sistema no puede encontrar el archivo especificado

Estoy teniendo un problema con este código. ¡Estoy tratando de cambiar el nombre de todos los nombres de archivos dentro de una carpeta para que ya no tengan +'s en ellos! Esto ha funcionado muchas veces antes pero de repente me sale el error:

WindowsError: [Error 2] The system cannot find the file specified at line 26

La línea 26 es la última línea en el código.

¿Alguien sabe por qué ocurre esto? ¡Le prometí a alguien que podría hacer esto en 5 minutos porque tenía un código! ¡¡Qué vergüenza no funciona !!

 import os, glob, sys folder = "C:\\Documents and Settings\\DuffA\\Bureaublad\\Johan\\10G304655_1" for root, dirs, filenames in os.walk(folder): for filename in filenames: filename = os.path.join(root, filename) old = "+" new = "_" for root, dirs, filenames in os.walk(folder): for filename in filenames: if old in filename: print (filename) os.rename(filename, filename.replace(old,new)) 

    Sospecho que puede tener problemas con los subdirectorios.

    Si tiene un directorio con los archivos ” a “, ” b ” y el subdirectorio ” dir ” con los archivos ” sub+1 ” y ” sub+2 “, la llamada a os.walk() producirá los siguientes valores:

     (('.',), ('dir',), ('a', 'b')) (('dir',), (,), ('sub+1', 'sub+2')) 

    Cuando procese la segunda tupla, llamará a rename() con 'sub+1', 'sub_1' como argumentos, cuando lo que desee sea 'dir\sub+1', 'dir\sub_1' .

    Para solucionar este problema, cambie el bucle en su código a:

     for root, dirs, filenames in os.walk(folder): for filename in filenames: filename = os.path.join(root, filename) ... process file here 

    que concatenará el directorio con el nombre de archivo antes de hacer algo con él.

    Editar:

    Creo que lo anterior es la respuesta correcta, pero no la razón correcta.

    Suponiendo que tenga un archivo ” File+1 ” en el directorio, os.walk() devolverá

     ("C:/Documents and Settings/DuffA/Bureaublad/Johan/10G304655_1/", (,), ("File+1",)) 

    A menos que esté en el directorio ” 10G304655_1 “, cuando llame a rename() , el archivo ” File+1 ” no se encontrará en el directorio actual , ya que no es el mismo que el directorio que está buscando os.walk() Al hacer la llamada a os.path.join() están diciendo a rename que busque en el directorio correcto.

    Editar 2

    Un ejemplo del código requerido podría ser:

     import os # Use a raw string, to reduce errors with \ characters. folder = r"C:\Documents and Settings\DuffA\Bureaublad\Johan\10G304655_1" old = '+' new = '_' for root, dirs, filenames in os.walk(folder): for filename in filenames: if old in filename: # If a '+' in the filename filename = os.path.join(root, filename) # Get the absolute path to the file. print (filename) os.rename(filename, filename.replace(old,new)) # Rename the file 

    Está utilizando splitext para determinar el nombre de archivo de origen para cambiar el nombre:

     filename_split = os.path.splitext(filename) # filename and extensionname (extension in [1]) filename_zero = filename_split[0]# ... os.rename(filename_zero, filename_zero.replace('+','_')) 

    Si se encuentra con un archivo con una extensión, obviamente, tratar de cambiar el nombre del archivo sin la extensión dará lugar a un error de “archivo no encontrado”.