Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中按顺序重新编号文件_Python_Directory - Fatal编程技术网

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

在python中按顺序重新编号文件,python,directory,Python,Directory,我正在建立一个数据库,在一个文件夹中收集数千张图像。我正在使用python脚本重命名数据库中的文件,但问题是,每当我将图像添加到文件夹并重命名它们时,它都会为所有文件提供不同的名称。有没有办法不以某种格式重命名文件 import os, shutil _src = ("/Path/to/Directory") _ext = ".png" for i,filename in enumerate(os.listdir(_src)): newna

我正在建立一个数据库,在一个文件夹中收集数千张图像。我正在使用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))

检查文件名是否与您的格式匹配,以及是否与模式匹配。此外,检查是否存在新文件名,并递增计数器,直到找到未使用的文件名:

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"...

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

给定此文件夹结构:

(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

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

检查/测试文件名的格式,如果格式不正确,则进行更改。将新图像添加到临时文件夹,然后在重命名后移动/复制它们。如果将文件移动到单独的文件夹,则将从该文件夹中的0开始重命名它们。