web-dev-qa-db-fra.com

Comment changer les noms de dossier en python?

J'ai plusieurs dossiers portant chacun le nom d'une personne, le ou les prénoms en premier et le nom de famille en dernier. Je souhaite modifier les noms de dossier afin que le nom de famille soit d'abord suivi d'une virgule, puis du ou des prénoms.

Par exemple, dans le dossier Test, j'ai:

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

et je veux faire ceci:

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

J'ai essayé certaines choses avec os.rename mais je n'arrivais pas à le faire fonctionner avec la longueur de nom variable, et je ne savais pas comment insérer la virgule dans le nom de famille.

De plus, certains des noms de dossier sont déjà sous la bonne forme, donc je dois ignorer ces dossiers lors du renommage. Je pense que vous pouvez le faire en ajoutant simplement un if, de sorte que si le nom du dossier contient une virgule, il continuera.

Sinon, le nom de famille sera toujours le dernier mot du nom du dossier.

Merci pour toute l'aide que vous pouvez apporter.

21
user1130955

Vous pouvez l'écrire assez simplement en utilisant os.listdir et les fonctions os.path :

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))
33
phihag
os.rename("Joe Blow", "Blow, Joe")

Semble bien fonctionner pour moi. Avec quelle partie avez-vous des problèmes?

14
jgritty

J'aime la suggestion de phihag de rpartition(), je pense que les éléments suivants sont pour la plupart équivalents:

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

Je préfère rsplit() parce que je ne veux pas me soucier du séparateur, mais je peux aussi voir qu'il est un peu plus bavard.

Configuration

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

Solution

>>> 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']
3
Zachary Young