Lo que espero lograr es escanear todos los archivos en el directorio especificado y eliminar los números que contiene el nombre. El problema es que no puedo cambiar el directorio con el código que está debajo.

Actualmente estoy en el Programa Udacity Full Stack Nanodegree, por lo que si alguien puede ayudarme, eso también es una ventaja en el programa.

Aquí está el código:

import os

def rename_files():
    #(1) Get file names from a folder
    file_list = os.listdir("/Users/bill/Documents/web/LocalServer/prank")
    #print (file_list)
    saved_path = os.getcwd()
    print("Our current working directory is " + saved_path)
    os.chdir('/Users/bill/Documents/web/LocalServer/prank')
    print("Our current working directory is ", saved_path)
    #(2) For each file, rename filename
    for file_name in file_list:
        #print("Old Name - " + file_name)
        #print("New Name - " + file_name.translate("0123457689"))
        os.rename(file_name, file_name.translate("0123457689"))
    os.chdir(saved_path)
    print("Our current working directory is ", saved_path)

rename_files()

Aquí está la salida que obtengo:

Our current working directory is /Users/bill/Documents/web/LocalServer
Our current working directory is  /Users/bill/Documents/web/LocalServer
Our current working directory is  /Users/bill/Documents/web/LocalServer

Actualización 1:

Finalmente he cambiado de directorio pero aún no puedo cambiar el nombre de los archivos. (Ej: 68chicago.jpg a chicago.jpg)

Aquí está mi código actual:

import os

def rename_files():
    #(1) Get file names from a folder 
    file_list = os.listdir("/Users/bill/Documents/web/LocalServer/prank")
    #print (file_list)
    saved_path = os.getcwd()
    print("Our current working directory is " + saved_path)
    os.chdir('/Users/bill/Documents/web/LocalServer/prank')
    new_path = os.getcwd()
    print("Our current working directory is ", new_path)
    #(2) For each file, rename filename
    for file_name in file_list:
        #print("Old Name - " + file_name)
        #print("New Name - " + file_name.translate("0123457689"))
        os.rename(file_name, file_name.translate("0123457689"))
    print("Our current working directory is ", new_path)

rename_files()

Aquí está mi salida actual:

Our current working directory is /Users/bill/Documents/web/LocalServer
Our current working directory is  /Users/bill/Documents/web/LocalServer/prank
Our current working directory is  /Users/bill/Documents/web/LocalServer/prank

Actualización 2:

Finalmente resolví el problema gracias a @Dan.

Aquí está su código:

import os
def rename_files():
    #(1) Get file names from a folder 
    file_list = os.listdir("/Users/bill/Documents/web/LocalServer/prank")
    #print (file_list)
    saved_path = os.getcwd()
    print("Our current working directory is " + saved_path)
    os.chdir('/Users/bill/Documents/web/LocalServer/prank')
    new_path = os.getcwd()
    print("Our current working directory is ", new_path)
    #(2) For each file, rename filename
    for file_name in file_list:
        #print("Old Name - " + file_name)
        #print("New Name - " + file_name.translate("0123457689"))
        os.rename(file_name, ''.join([i for i in file_name if not i.isdigit()])) # This works on my machine
    os.chdir(saved_path)
    print("Our current working directory is ", saved_path)
rename_files()
2
Mr.Bill 14 ene. 2017 a las 02:30

4 respuestas

La mejor respuesta

Parece que quiere cambiar a un directorio y luego volver al primer directorio. Si ese es el caso, quieres algo como esto:

import os

def rename_files():
    #(1) Get file names from a folder
    file_list = os.listdir("/Users/bill/Documents/web/LocalServer/prank")
    #print (file_list)
    saved_path = os.getcwd()
    print("Our current working directory is " + saved_path)
    os.chdir('/Users/bill/Documents/web/LocalServer/prank')
    new_path = os.getcwd()
    print("Our current working directory is ", new_path)
    #(2) For each file, rename filename
    for file_name in file_list:
        #print("Old Name - " + file_name)
        #print("New Name - " + file_name.translate("0123457689"))
        os.rename(file_name, ''.join([i for i in file_name if not i.isdigit()])) # This works on my machine

    os.chdir(saved_path)
    print("Our current working directory is ", saved_path)

rename_files()
3
martineau 14 ene. 2017 a las 02:47

Su problema es que utiliza .translate() incorrectamente. No cambia los nombres de los archivos en absoluto, por lo que cambiar el nombre realmente cambia el nombre de X a X:

'68chicago.jpg'.translate('0123457689')
# '68chicago.jpg'

Intente usar la comprensión de la lista:

def clean_name(name):
  return ''.join(x for x in name if not x.isdigit())
# 'chicago.jpg'
1
DYZ 14 ene. 2017 a las 00:00

Aquí hay una versión que no requiere cambiar el directorio actual. Simplemente especifique el directorio donde se cambiarán los nombres de los archivos. Si especifica la ruta completa al nombre antiguo y nuevo, no se requiere cambiar el directorio.

Esto también muestra cómo usar translate correctamente. maketrans toma uno, dos o tres parámetros (consulte documentos). La versión de tres parámetros toma dos cadenas de igual longitud para la traducción 1: 1, más un tercer parámetro de caracteres para eliminar. Devuelve un diccionario adecuado para ser utilizado con translate.

import os

def rename_files(directory):
    xlat = str.maketrans('','','0123457689')
    file_list = os.listdir(directory)
    for file_name in file_list:
        old_name = os.path.join(directory,file_name)
        new_name = os.path.join(directory,file_name.translate(xlat))
        os.rename(old_name,new_name)

rename_files('/Users/bill/Documents/web/LocalServer/prank')
1
Mark Tolonen 14 ene. 2017 a las 00:33

El problema principal es que su código no está utilizando str.translate() método de la manera adecuada: debe pasarle una tabla de traducción para que funcione.

Lo siguiente funciona y evita cambiar el nombre de los archivos que no es necesario (es decir, no les cambia el nombre a su nombre actual). Esto requiere un poco de procesamiento adicional, pero probablemente sea más rápido que realizar una operación inútil a nivel del sistema operativo.

Nota: una solución más sólida también necesitaría manejar cualquier excepción que la llamada os.rename() pudiera generar, lo que definitivamente podría ocurrir por varias razones.

Por ejemplo:

  • Quizás ya exista un archivo con el nombre traducido.
  • Todos los caracteres del archivo original se eliminan, por lo que el nuevo nombre del archivo es la cadena vacía.
  • Los permisos de archivo o atributo evitan el cambio de nombre.
  • etcetera.

El código:

from contextlib import contextmanager
import string
import os

@contextmanager
def temp_cd(path):
    """Temporarily change the current directory to path, yield, then restore it."""
    saved_path = os.getcwd()
    yield
    os.chdir(saved_path)

def rename_files(path):
    TRANS_TABLE = str.maketrans(dict.fromkeys(string.digits))
    with temp_cd(path):
        for file_name in os.listdir(path):
            if any(ch in file_name for ch in string.digits):
#                os.rename(file_name, file_name.translate(TRANS_TABLE))
                print(file_name, '->', file_name.translate(TRANS_TABLE))

rename_files("/Users/bill/Documents/web/LocalServer/prank")
1
martineau 14 ene. 2017 a las 02:45