在python中按顺序重新编号文件

时间:2017-07-31 16:10:57

标签: python directory

我正在建立一个数据库,收集文件夹中的数千张图片。我正在使用python脚本重命名数据库中的文件,但问题是每当我将图像添加到文件夹并重命名它们时,它会为所有文件提供不同的名称。有没有办法不以某种格式重命名文件?

{
    "amount_money": {
      "amount" : "100",
      "currency_code" : "USD"
    },
    "auto_return":true,
    "callback_url" : "https://floating-inlet-19449.herokuapp.com/redirect",
    "client_id" : "sq0idp-U8x6mJyLFtHuhCfv9sqL5g",
    "version": "1.3",
    "notes": "notes for the transaction",
    "options" : {
      "supported_tender_types" : ["CREDIT_CARD"]
    }

2 个答案:

答案 0 :(得分: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 :(得分:1)

因此,首先需要找出序列中最大的文件名。您可以使用glob功能。

给定此文件夹结构:

(venv) user@MacBookPro:~/Projects/test$ ls -al
total 16
drwxr-xr-x   7 user  staff   238B Jul 31 12:34 ./
drwxr-xr-x@ 17 user  staff   578B Jul 14 13:58 ../
-rw-r--r--@  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) user@MacBookPro:~/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

然后过滤掉隐藏的文件。