У меня есть папка с более чем 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, но рассмотрение документов, я предполагаю, что мог использовать карту для создания нового списка, отфильтровывающего только числовую часть и затем вид, которые перечисляют, затем выполняют итерации этого? С по 100K файлам это могло быть тяжело. Любые приветствующиеся подсказки!
Спасибо всем за ваши предложения, я попробую их всех, чтобы изучить различные подходы. Решение, к которому я пришел, основано на использовании естественной сортировки в моем списке файлов, а затем повторении этого для переименования. Это был один из предложенных ответов, но по какой-то причине он исчез, поэтому я не могу отметить его как принятый!
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/
Почему бы вам не сделать это в два этапа. Разобрать все файлы и переименовать их, добавив номера, а затем запустить другой сценарий, который берет эти файлы, которые теперь отсортированы правильно, и переименовывает их, чтобы они были смежными?
1) Возьмите число в имени файла. 2) Заполните его нулями слева 3) Сохраните имя.
Есть три шага. Первый - получение всех имен файлов. Второй - преобразование имен файлов. Третий - их переименование.
Если все файлы находятся в одной папке, то glob должен работать.
import glob
filenames = glob.glob("/path/to/folder/*.txt")
Далее нужно изменить имя файла. Для этого вы можете печатать с помощью padding.
>>> 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)
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, ...) с прокладкой, как вы хотите, в имени назначения.
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"
Надеюсь, это поможет