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的文件,这可能很重.欢迎任何提示!
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,...)填充.
谢谢大家的建议,我会尝试所有的方法来学习不同的方法。我寻求的解决方案是基于对文件列表使用自然排序,然后迭代以重命名。这是建议的答案之一,但由于某种原因它现在已经消失了,所以我无法将其标记为已接受!
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/中定义