Как изменить имена папок в Python? - PullRequest
20 голосов
/ 05 января 2012

У меня есть несколько папок, каждая из которых содержит имя человека, имя и фамилию вначале и фамилию.Я хочу изменить имена папок так, чтобы за фамилией сначала следовала запятая, а затем следовали первые имена.

Например, в папке Test у меня есть:

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

и я хочу сделать это:

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

Я пробовал некоторые вещи с os.rename, но я не мог заставить его работать с переменной длиной имени,и я не был уверен, как вставить запятую в фамилию.

Кроме того, некоторые имена папок уже имеют правильную форму, поэтому мне нужно пропустить эти папки во время переименования.Я думаю, что вы можете сделать это, просто добавив if, чтобы, если имя папки содержало запятую, оно продолжалось.

В противном случае фамилия всегда будет последним словом в имени папки.

Спасибо за любую помощь, которую вы можете предоставить.

Ответы [ 3 ]

30 голосов
/ 05 января 2012

Вы можете написать это довольно просто, используя os.listdir и функции 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))
9 голосов
/ 05 января 2012
os.rename("Joe Blow", "Blow, Joe")

Кажется, работает хорошо для меня.С какой частью у тебя проблемы?

3 голосов
/ 05 января 2012

Мне нравится предложение Phihag о rpartition(), я думаю, что следующие в основном эквивалентны:

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

Я предпочитаю rsplit(), потому что я не хочу заботиться о разделителе, но я также могувижу, что это немного более многословно.

Настройка

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

Решение

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