2016-07-05 10 views
0

Python beginner here。パターンのあるファイルの名前を変更する

私は(順番に)という名前の画像ファイルの何百ものディレクトリがあります。今

002_IMG_N、

002_IMG_001、002_IMG_002、002_IMG_003を、私はそのような5ものの画像の名前を変更しようとしています行のファイルは1:5の「N」を持っています。つまり、連続する5つの画像のすべてがN、1から5になります。数字「N」の前に別の文字列を付けることもできます。この文字列は、N個の画像のセットを追跡する(例えば、IMG_001_1、IMG_001_2、.. IMG_001_N、IMG_002_1、IMG_002_2、... 、IMG_00X_N)。

Mac上のpython 2.7.10上の擬似コードは次のようになります、

if int(filename[9:12]) % 5 == 0 

が、これは意味します:

import os 

myDir = "/Users/path/to/dir/" 
fileList = os.listdir(myDir) 

for filename in fileList : 
    #split the images into sets of five each 
    newFile = 'IMG_' + '00' + X + '_' + N 
     #loop through images and rename 
      os.rename(fileName, newFile) 

私は、私がforループ内の条件が必要だと思うように気にいら私は1から5の5つの別々の条件を作成しなければなりませんが、それは正しいとは思えません。どんなヒントも高く評価されますか?

編集:どのような出力が必要なのかはっきりしませんでした。私は次のように最終的なファイル名を取得する機能を探しています:IMG_001_1、IMG_001_2、... IMG_001_5、IMG_002_1、IMG_002_2、... IMG_002_5、...

+0

私は私はあなたの名前を変更するルールを理解してかはわかりません。具体的な例を教えてください。 –

+0

だから彼らは001 ...、002 ...、003 ...? –

+0

このファイル名を002_IMG_001に変換することを確認してください。この回答をコメントに入れないでください。 – PyNEwbie

答えて

0

私は、これは動作するはずだと思う:

my_list = ["002_IMG_001", "002_IMG_002", "002_IMG_003", "002_IMG_004", "002_IMG_005", 
     "002_IMG_006", "002_IMG_007", "002_IMG_008", "002_IMG_009", "002_IMG_0010", 
     "002_IMG_011", "002_IMG_012", "002_IMG_013", "002_IMG_014", "002_IMG_015", 
     "002_IMG_016", "002_IMG_017", "002_IMG_018", "002_IMG_019", "002_IMG_0020", 
     ] 
fileList.sort() 

print("Original list:\n") 
print(fileList) 

new_list = [] 

for index, old_file_name in enumerate(fileList): 
    group, subgroup = divmod(index,5) 
    group, subgroup = group + 1, subgroup + 1 
    new_file_name = "IMG_{0:03d}_{1}".format(group, subgroup) 
    new_list.append(new_file_name) 

    os.rename(old_file_name, new_file_name) 

print("\nNew list:\n") 
print (new_list) 
ここ

が出力されます。

Original list: 

['002_IMG_001', '002_IMG_002', '002_IMG_003', '002_IMG_004', '002_IMG_005', 
'002_IMG_006', '002_IMG_007', '002_IMG_008', '002_IMG_009', '002_IMG_0010', 
'002_IMG_011', '002_IMG_012', '002_IMG_013', '002_IMG_014', '002_IMG_015', 
'002_IMG_016', '002_IMG_017', '002_IMG_018', '002_IMG_019', '002_IMG_0020'] 

New list: 

['IMG_001_1', 'IMG_001_2', 'IMG_001_3', 'IMG_001_4', 'IMG_001_5', 
'IMG_002_1', 'IMG_002_2', 'IMG_002_3', 'IMG_002_4', 'IMG_002_5', 
'IMG_003_1', 'IMG_003_2', 'IMG_003_3', 'IMG_003_4', 'IMG_003_5', 
'IMG_004_1', 'IMG_004_2', 'IMG_004_3', 'IMG_004_4', 'IMG_004_5'] 
+0

Exatcly私が必要とした出力。ほんの1つのコメント:forループ内の元のファイル名にアクセスして、最後のファイル名を変更する必要があります。あなたはそれについて何か提案していますか? – wheatSingh

+0

私はコードを編集しました。別のループをネストする必要はありません。 'for'ループの 'enumerate'キーワードを参照してください。これにより、 'for'ループで索引とリスト項目の両方が利用可能になります。私は別の提案があります。 listdirは必ずディレクトリ項目をアルファベット順に並べる必要はありません。ループの前にステートメント "fileList.sort()"を追加することができます。そのステートメントには何も割り当てないでください。元のリストを永続的にソートします。 – Joe

+0

"fileList.sort()"が追加され、魅力的に機能しました。どうもありがとう ! – wheatSingh

関連する問題