2012-01-04 7 views
12

Ho più cartelle ognuna con il nome di una persona, con il primo nome (s) prima e il cognome ultimo. Voglio cambiare i nomi delle cartelle in modo che il cognome sia prima seguito da una virgola e poi seguano i nomi.Come cambiare i nomi delle cartelle in python?

A titolo di esempio, nella cartella test, ho:

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

e voglio fare questo:

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

ho provato alcune cose con os.rename ma non potevo Sembra che funzioni con la lunghezza del nome variabile e non ero sicuro di come inserire la virgola nel cognome.

Inoltre, alcuni nomi di cartella sono già nella forma corretta, quindi è necessario saltare queste cartelle durante la ridenominazione. Penso che puoi farlo aggiungendo un if, in modo che se il nome della cartella contiene una virgola continuerà.

In caso contrario, il cognome sarà sempre l'ultima parola nel nome della cartella.

Grazie per l'aiuto che puoi fornire.

risposta

25

Potete scriverlo fuori abbastanza straight-forward, utilizzando os.listdir ei os.path funzioni:

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

Quando ho provato questo mi viene detto "Il sistema non riesce a trovare il percorso specificato: 'C:/Test /*.*'". Non sono sicuro del significato. – user1130955

+0

@ user1130955 Ciò significa che 'C:/Test' non esiste sul tuo sistema. Sei sicuro che quella sia la directory in cui si trovano le tue directory dei nomi utente? – phihag

+0

Ciò significa che c: \ Test è completamente inesistente. – jgritty

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

Sembra funzionare per me. Con quale parte hai problemi?

+0

Questo va bene quando lo faccio individualmente per ogni cartella, ma non riusciva a farlo funzionare per un ciclo attraverso tutti le cartelle. Il problema è che non so come specificare i nomi e i cognomi per tutte le cartelle. – user1130955

+0

L'esempio di phihag qui sopra funzionerà perfettamente. Usa la rnpartition per dividere la stringa. Probabilmente avrei usato split(), ma il suo esempio dovrebbe funzionare. – jgritty

3

mi piace il suggerimento di phihag di rpartition(), penso che il seguente sono per lo più equivalente:

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

Preferisco lo rsplit() perché non voglio preoccuparmi del separatore, ma posso anche vedere che è un po 'più prolisso.

Setup

>>> 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'] 

Soluzione

>>> 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']