使用python批量重命名100K文件

mem*_*emo 9 python file-rename batch-rename

我有一个包含超过100,000个文件的文件夹,所有文件都使用相同的存根编号,但没有前导零,并且数字并不总是连续的(通常它们是,但是有间隙)例如:

file-21.png, 
file-22.png,  
file-640.png, 
file-641.png, 
file-642.png, 
file-645.png, 
file-2130.png, 
file-2131.png, 
file-3012.png, 
Run Code Online (Sandbox Code Playgroud)

等等

我想批量处理它来创建填充的,连续的文件.例如:

file-000000.png, 
file-000001.png, 
file-000002.png, 
file-000003.png, 
Run Code Online (Sandbox Code Playgroud)

当我用for filename in os.listdir('.'):文件解析文件夹时,我不想按顺序出现.可以理解他们出现了

 file-1, 
 file-1x, 
 file-1xx, 
 file-1xxx,
Run Code Online (Sandbox Code Playgroud)

等等

 file-2, 
 file-2x, 
 file-2xx, 
Run Code Online (Sandbox Code Playgroud)

我怎么能按数值的顺序让它通过?我是一个完整的python noob,但是看着文档,我猜我可以使用map创建一个新的列表,只过滤掉数字部分,然后对该列表进行排序,然后迭代它?有超过100K的文件,这可能很重.欢迎任何提示!

Ale*_*lli 8

import re
thenum = re.compile('^file-(\d+)\.png$')

def bynumber(fn):
  mo = thenum.match(fn)
  if mo: return int(mo.group(1))

allnames = os.listdir('.')
allnames.sort(key=bynumber)
Run Code Online (Sandbox Code Playgroud)

现在您按照所需的顺序拥有文件并可以循环

for i, fn in enumerate(allnames):
  ...
Run Code Online (Sandbox Code Playgroud)

使用i在目标名称中填充的渐进编号(将为0,1,2,...)填充.


mem*_*emo 4

谢谢大家的建议,我会尝试所有的方法来学习不同的方法。我寻求的解决方案是基于对文件列表使用自然排序,然后迭代以重命名。这是建议的答案之一,但由于某种原因它现在已经消失了,所以我无法将其标记为已接受!

import os
files = os.listdir('.')
natsort(files)
index = 0
for filename in files:
    os.rename(filename, str(index).zfill(7)+'.png')
    index += 1
Run Code Online (Sandbox Code Playgroud)

其中 natsort 在http://code.activestate.com/recipes/285264-natural-string-sorting/中定义