2017-07-31 18 views
1

私はフォルダに数千の画像を集めたデータベースを構築しています。私はデータベースのファイルの名前を変更するPythonスクリプトを使用していますが、問題は、フォルダにイメージを追加して名前を変更すると、すべてのファイルに別の名前が付けられることです。特定の形式でファイルの名前を変更しない方法はありますか?Pythonでファイルを順番に番号を付け直す

import os, shutil 
    _src = ("/Path/to/Directory") 

    _ext = ".png" 


    for i,filename in enumerate(os.listdir(_src)): 

     newname = ('People-' + str(i).zfill(3) + _ext) 
     os.rename(os.path.join(_src, filename), os.path.join(_src, newname)) 


     print('renaming "%s" to "%s"...' % (filename, newname)) 
+0

ファイル名の形式を確認してテストし、正しくない場合は変更してください。 – wwii

+0

新しいイメージを一時フォルダに追加し、名前を変更した後に移動/コピーします。 – wwii

+0

ファイルを別のフォルダに移動すると、そのフォルダ内の0から始まる名前に変更されます。 – Asori12

答えて

1

ファイル名がフォーマットと一致するかどうかをパターンマッチで確認します。また、新しいファイル名の存在をチェックし、未使用のものを見つけるまで、カウンタをインクリメント:

import os 
import glob 
import re 

src = r'path\to\directory' 
ext = '.png' 
i = 0 
for filename in glob.glob(os.path.join(src,'*' + ext)): 
    if not re.search('People-\d\d\d' + re.escape(ext) +'$',filename): 
     while True: 
      newname = os.path.join(src,'People-{:03d}{}'.format(i,ext)) 
      if os.path.exists(newname): 
       i += 1 
      else: 
       break 
     print('renaming "%s" to "%s"...' % (filename, newname)) 
     os.rename(filename,newname) 

ここでファイルのリストを開始する例を示します

People-000.png 
People-001.png 
People-003.png 
a.png 
b.png 
c.png 

と出力:

renaming "a.png" to "People-002.png"... 
renaming "b.png" to "People-004.png"... 
renaming "c.png" to "People-005.png"... 
1

まず、シーケンス内で最大のファイル名を見つける必要があります。 glob機能を使用できます。

与えられ、このフォルダ構造:

(venv) [email protected]:~/Projects/test$ ls -al 
total 16 
drwxr-xr-x 7 user staff 238B Jul 31 12:34 ./ 
[email protected] 17 user staff 578B Jul 14 13:58 ../ 
[email protected] 1 user staff 6.0K Mar 8 2016 .DS_Store 
-rw-r--r-- 1 user staff  0B Jul 31 12:34 People-001.png 
-rw-r--r-- 1 user staff  0B Jul 31 12:34 People-002.png 
-rw-r--r-- 1 user staff  0B Jul 31 12:34 People-003.png 
-rw-r--r-- 1 user staff  0B Jul 31 12:34 foo.png 

(venv) [email protected]:~/Projects/test$ python 
Python 3.6.1 (default, Apr 4 2017, 09:40:21) 
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.38)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from glob import glob 
>>> glob('/Users/user/Projects/test/People-???.png') 
['/Users/user/Projects/test/People-001.png', '/Users/user/Projects/test/People-002.png', '/Users/user/Projects/test/People-003.png'] 
>>> max(glob('/Users/user/Projects/test/People-???.png')) 
'/Users/user/Projects/test/People-003.png' 
>>> max(glob('/Users/user/Projects/test/People-???.png')).split('.')[0].split('-')[1] 
'003' 

次の事、が興味を持ったファイルを含んでいない列挙(os.listdir(_src))以来、あなたはそのインデックスを使用することはできません。上からの最大インデックス:

>>> max_index = int(max(glob('/Users/user/Projects/test/People-???.png')).split('.')[0].split('-')[1]) 
>>> for idx,name in enumerate(os.listdir('/Users/user/Projects/test/')): 
...  if not name.startswith('People'): 
...   max_index += 1 
...   print (max_index, name) 
... 
4 .DS_Store 
5 foo.png 

もちろん、隠しファイルを除外します。

関連する問題