2012-01-04 10 views
12

私は人の名前が最初に、姓が最後の複数のフォルダを持っています。姓がカンマで始まり、その後に最初の名前が続くように、フォルダ名を変更したいと思います。pythonでフォルダ名を変更するには?

例として、フォルダテストで、私が持っている:

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でいくつかのことを試してみましたが、私はcouldnさまざまな名前の長さで動作するように見えますが、姓にカンマを挿入する方法がわかりませんでした。

また、フォルダ名の一部は既に正しい形式であるため、名前変更中にこれらのフォルダをスキップする必要があります。私はあなたがちょうどifを追加することでこれを行うことができると思うので、フォルダー名にコンマが含まれていればそれは続行されます。

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

ご協力いただきありがとうございます。

答えて

25

あなたは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)) 
+0

私はこれを試してみたときに "システムは指定されたパスを見つけることができませんでした: 'C:/ Test /*.*'"。これが何を意味するかわからない。 – user1130955

+0

@ user1130955これは 'C:/ Test'があなたのシステムに存在しないことを意味します。それはあなたのユーザ名のディレクトリがあるディレクトリですか? – phihag

+0

これは、c:\ Testが完全に存在しないことを意味します。 – jgritty

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

私のために正常に動作するようです。どちらの部分に問題がありますか?

+0

私はフォルダごとに個別にそれを行うとき、これは素晴らしいですが、私はそれがすべてをループのために動作させるように見えることができませんでしたフォルダ。問題は、私はすべてのフォルダのファーストネームと姓を指定する方法がわからないことです。 – user1130955

+0

上記のphihagの例はおそらく完全に機能します。彼はrnパーティションを使用して文字列を分割します。私はおそらくsplit()を使用したでしょうが、彼の例はうまくいくはずです。 – jgritty

3

私はrpartition()のphihagの提案が好き、私は次はほとんど同等だと思う:

>>> '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'] 
関連する問題