web-dev-qa-db-ja.com

Pythonでフォルダ名を変更するにはどうすればよいですか?

私は複数のフォルダを持ち、それぞれに人の名前があり、名が最初で姓が最後です。フォルダ名を変更して、姓の後にコンマが続き、その後に名が続くようにします。

例として、フォルダ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を追加するだけでこれを行うことができると思うので、フォルダ名にカンマが含まれている場合は続行します。

それ以外の場合、姓は常にフォルダ名の最後の単語になります。

あなたが提供できる助けをありがとう。

20
user1130955

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

私にとってはうまくいくようです。どの部分に問題がありますか?

9
jgritty

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