9

我有一个包含超过 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, 

等等

我想对此进行批处理以创建填充的连续文件。例如:

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 菜鸟,但是查看文档我猜我可以使用 map 创建一个新列表,只过滤掉数字部分,然后对该列表进行排序,然后迭代它?对于超过 100K 的文件,这可能很重。欢迎任何提示!

4

6 回答 6

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、...)。

于 2010-06-20T01:03:07.073 回答
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)
于 2010-06-20T01:01:35.640 回答
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/中定义

于 2010-06-20T11:53:52.093 回答
1

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

于 2010-06-20T00:55:55.330 回答
0

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

于 2010-06-20T00:55:44.240 回答
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"

希望这可以帮助

于 2010-06-20T04:58:37.707 回答