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

时间:2010-06-20 00:48:18

标签: 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, 

我想批处理这个以创建填充的,连续的文件。 e.g:

file-000000.png, 
file-000001.png, 
file-000002.png, 
file-000003.png, 

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

 file-1, 
 file-1x, 
 file-1xx, 
 file-1xxx,

等。然后

 file-2, 
 file-2x, 
 file-2xx, 

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

6 个答案:

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

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

for i, fn in enumerate(allnames):
  ...

在目的地名称中使用渐进数字i(将为0,1,2 ......)填充。

答案 1 :(得分:4)

有三个步骤。第一个是获取所有文件名。第二个是转换文件名。第三是重命名。

如果所有文件都在同一个文件夹中,那么glob应该可以工作。

import glob
filenames = glob.glob("/path/to/folder/*.txt")

接下来,您要更改文件的名称。您可以使用填充进行打印来执行此操作。

>>> filename = "file-338.txt"
>>> import os
>>> fnpart = os.path.splitext(filename)[0]
>>> fnpart
'file-338'
>>> _, num = fnpart.split("-")
>>> num.rjust(5, "0")
'00338'
>>> newname = "file-%s.txt" % num.rjust(5, "0")
>>> newname
'file-00338.txt'

现在,您需要将它们全部重命名。 os.rename就是这么做的。

os.rename(filename, newname)

把它放在一起:

for filename in glob.glob("/path/to/folder/*.txt"): # loop through each file
    newname = make_new_filename(filename) # create a function that does step 2, above
    os.rename(filename, newname)

答案 2 :(得分:4)

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

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

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

中定义

答案 3 :(得分:1)

为什么不分两步完成。解析所有文件并使用填充的数字重命名,然后运行另一个脚本来获取那些现在正确排序的文件,并重命名它们以使它们连续?

答案 4 :(得分:0)

1)取文件名中的数字。 2)左键用零填充它 3)保存姓名。

答案 5 :(得分:0)

def renamer():
    for iname in os.listdir('.'):
        first, second = iname.replace(" ", "").split("-")
        number, ext = second.split('.')
        first, number, ext = first.strip(), number.strip(), ext.strip()
        number = '0'*(6-len(number)) + number  # pad the number to be 7 digits long
        oname = first + "-" + number + '.' + ext
        os.rename(iname, oname)
    print "Done"

希望这有帮助