Python:检索和重命名目录中的索引文件

时间:2017-07-30 21:24:43

标签: python python-3.x filesystems file-management

我创建了一个脚本来重命名给定目录中的索引文件

例如,如果目录包含以下文件>> (bar001.txt,bar004.txt,bar007.txt,foo2.txt,foo5.txt,morty.dat,rick.py)。我的脚本应该能够“仅”重命名索引文件,并缩小像这样的间隙>> (bar001.txt,bar002.txt,bar003.txt,foo1.txt,foo2.txt ...)。

我把下面的完整脚本放在哪里不起作用。该错误是合乎逻辑的,因为没有给出错误消息,但目录中的文件保持不变。

#! python3

import os, re

working_dir = os.path.abspath('.')

# A regex pattern that matches files with prefix,numbering and then extension
pattern = re.compile(r'''
    ^(.*?)        # text before the file number
    (\d+)         # file index
    (\.([a-z]+))$ # file extension
''',re.VERBOSE)

# Method that renames the items of an array
def rename(array):
    for i in range(len(array)):
        matchObj = pattern.search(array[i])
        temp = list(matchObj.group(2))
        temp[-1] = str(i+1)
        index = ''.join(temp)
        array[i] = matchObj.group(1) + index + matchObj.group(3)
    return(array)

array = []
directory = sorted(os.listdir('.'))

for item in directory:
    matchObj = pattern.search(item)
    if not matchObj:
        continue
    if len(array) == 0 or matchObj.group(1) in array[0]:
        array.append(item)
    else:
        temp = array
        newNames = rename(temp)
        for i in range(len(temp)):
            os.rename(os.path.join(working_dir,temp[i]),
                        os.path.join(working_dir,newNames[i]))
        array.clear() #reset array for other files
        array.append(item) 

1 个答案:

答案 0 :(得分:1)

总而言之,您希望找到名称以数字和结尾的每个文件 为每个具有相同名称的文件填写空白,除了数字后缀。您想要创建任何新文件;相反,应使用最高数字的那些填补空白。

由于此摘要可以很好地转换为代码,因此我会这样做,而不是使用代码。

import re
import os

from os import path

folder  = 'path/to/folder/'
pattern = re.compile(r'(.*?)(\d+)(\.[a-z]+)$')
summary = {}

for fn in os.listdir(folder):
  m = pattern.match(fn)
  if m and path.isfile(path.join(folder, fn)):
    # Create a key if there isn't one, add the 'index' to the set
    # The first item in the tuple - len(n) - tells use how the numbers should be formatted later on
    name, n, ext = m.groups()
    summary.setdefault((name, ext), (len(n), set()))[1].add(int(n))

for (name, ext), (n, current) in summary.items():
  required = set(range(1, len(current)+1)) # You want these
  gaps     = required - current            # You're missing these
  superfluous = current - required         # You don't need these, so they should be renamed to fill the gaps

  assert(len(gaps) == len(superfluous)), 'Something has gone wrong'

  for old, new in zip(superfluous, gaps):
      oldname = '{name}{n:>0{pad}}{ext}'.format(pad=n, name=name, n=old, ext=ext)
      newname = '{name}{n:>0{pad}}{ext}'.format(pad=n, name=name, n=new, ext=ext)

      print('{old} should be replaced with {new}'.format(old=oldname, new=newname))

我认为这涵盖了它。