2017-07-31 35 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 

當然,過濾掉隱藏的文件。