2012-01-04 23 views
12

Tengo varias carpetas, cada una con el nombre de una persona, primero el primer nombre y el último apellido. Quiero cambiar los nombres de las carpetas para que el apellido primero vaya seguido de una coma y luego sigan los nombres.¿Cómo cambiar los nombres de las carpetas en python?

A modo de ejemplo, en la carpeta de prueba , tengo:

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

y quiero hacer esto:

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

Probé algunas cosas con os.rename pero no pude Parece que no funciona con la longitud variable del nombre, y no estaba seguro de cómo insertar la coma en el apellido.

Además, algunos de los nombres de las carpetas ya están en la forma correcta, así que debo omitir estas carpetas durante el cambio de nombre. Creo que puede hacer esto simplemente agregando un if, de modo que si el nombre de la carpeta contiene una coma, continuará.

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

Gracias por cualquier ayuda que pueda proporcionar.

Respuesta

25

Puede escribirlo bastante sencilla, utilizando os.listdir y los os.path 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)) 
+0

Cuando probé esto me dijeron "El sistema no puede encontrar la ruta especificada: 'C:/Test /*.*'". No estoy seguro que significa esto. – user1130955

+0

@ user1130955 Eso significa que 'C:/Test' no existe en su sistema. ¿Estás seguro de que ese es el directorio donde se encuentran los directorios de tus nombres de usuario? – phihag

+0

Eso significa que c: \ Test es completamente inexistente. – jgritty

1
os.rename("Joe Blow", "Blow, Joe") 

parece funcionar bien para mí. ¿Con qué parte estás teniendo problemas?

+0

Esto está bien cuando lo hago de forma individual para cada carpeta, pero yo no era capaz de hacer que funcione para un bucle a través de todos las carpetas. El problema es que no sé cómo especificar los nombres y los apellidos de todas las carpetas. – user1130955

+0

El ejemplo anterior de phihag probablemente funcionará perfectamente. Él usa la división para dividir la cadena. Probablemente hubiera usado split(), pero su ejemplo debería funcionar. – jgritty

3

me gusta la sugerencia de phihag de rpartition(), creo que el siguiente en su mayoría son equivalentes:

>>> '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 preocuparme por el separador, pero también puedo ver que es un poco más detallado.

Configuració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'] 
Cuestiones relacionadas