Tengo varias carpetas, cada una con el nombre de una persona, con el primer nombre(s) y apellido última. Quiero cambiar los nombres de las carpetas, de modo que el apellido primero, seguido por una coma y luego el nombre(s) de seguir.

Como un ejemplo, en la carpeta Prueba, tengo:

C:/Test/John Smith
C:/Test/Fred Jones
C:/Test/Ben Jack Martin

y yo quiero hacer esto:

C:/Test/Smith, John
C:/Test/Jones, Fred
C:/Test/Martin, Ben Jack

He intentado algunas cosas con el sistema operativo.cambiar el nombre, pero yo no podía hacer el trabajo con la variación de la longitud del nombre, y yo no estaba seguro de cómo insertar la coma en el apellido.

También, algunos de los nombres de las carpetas ya están en la forma correcta, así que tengo que omitir estas carpetas durante el cambio de nombre. Creo que se puede hacer simplemente añadiendo un si, por lo que si el nombre de la carpeta contiene una coma va a continuar.

De lo contrario, el apellido será siempre la última palabra en el nombre de la carpeta.

Gracias por cualquier ayuda que pueda ofrecer.

OriginalEl autor user1130955 | 2012-01-04

3 Comentarios

  1. 29

    Se puede escribir bastante recta hacia adelante, utilizando os.listdir y la os.camino funciones:

    import os
    basedir = 'C:/Test'
    for fn in os.listdir(basedir):
      if not os.path.isdir(os.path.join(basedir, fn)):
        continue # Not a directory
      if ',' in fn:
        continue # Already in the correct form
      if ' ' not in fn:
        continue # Invalid format
      firstname,_,surname = fn.rpartition(' ')
      os.rename(os.path.join(basedir, fn),
                os.path.join(basedir, surname + ', ' + firstname))
    Cuando lo probé me dice «El sistema no puede encontrar la ruta especificada: ‘C:/Test/*.*’ «. No está seguro de lo que esto significa.
    Eso significa que C:/Test no existe en el sistema. ¿Estás seguro de que ese es el directorio donde su nombre de usuario directorios mentira?
    Que significa c:\Test es completamente inexistente.
    Lo siento, no es un problema, yo tenía mi directorio incorrecto. Fijo y funciona perfectamente. Gracias.
    He estado usando el código de otras carpetas, y tengo este error en algunas carpetas: [Error 183] No se puede crear un archivo que ya existe. Esto es sólo debido a que algunas de las carpetas ya contienen tanto la corecta nombre y la falta de corrección de nombre. Sólo quiero que me combinación de estas carpetas. Funcionaría si acabo de añadir otro si en el código, así que si ya existe la carpeta, a continuación, combinar sus contenidos?

    OriginalEl autor phihag

  2. 6
    os.rename("Joe Blow", "Blow, Joe")

    Parece que funciona muy bien para mí. Qué parte estás teniendo problemas con?

    Esto está bien cuando lo hago de forma individual para cada carpeta, pero yo no podía hacer el trabajo de un bucle a través de todas las carpetas. El problema es que no sé cómo especificar los nombres de pila y los apellidos de todas las carpetas.
    phihag del ejemplo anterior probablemente va a funcionar perfectamente. Él utiliza el rnpartition para dividir la cadena. Probablemente tendría que he usado split(), pero su ejemplo debería funcionar.

    OriginalEl autor jgritty

  3. 3

    Me gusta phihag la sugerencia de rpartition(), creo que los siguientes son en su mayoría equivalente:

    >>> 'first second third fourth'.rpartition(' ')
    ('first second third', ' ', 'fourth')
    >>> 'first second third fourth'.rsplit(None, 1)
    ['first second third', 'fourth']

    Prefiero rsplit() porque no quiero la atención sobre el separador, pero también puedo ver que es un poco más detallado.

    Instalación

    >>> base = 'C:\Test'
    >>> os.makedirs(os.path.join(base, 'John Smith'))
    >>> os.makedirs(os.path.join(base, 'Fred Jones'))
    >>> os.makedirs(os.path.join(base, 'Ben Jack Martin'))
    >>> os.listdir(base)
    ['Ben Jack Martin', 'Fred Jones', 'John Smith']

    Solución

    >>> for old_name in os.listdir(base):
        # [::-1] is slice notation for "reverse"
        new_name = ', '.join(old_name.rsplit(None, 1)[::-1])
        os.rename(os.path.join(base, old_name),
              os.path.join(base, new_name))
    
    
    >>> os.listdir(base)
    ['Jones, Fred', 'Martin, Ben Jack', 'Smith, John']

    OriginalEl autor Zachary Young

Dejar respuesta

Please enter your comment!
Please enter your name here