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

当然,过滤掉隐藏的文件。