我有一个包含超过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的文件,这可能很重。欢迎任何提示!
答案 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"
希望这有帮助