пакет, переименовывающий 100K файлы с Python

У меня есть папка с более чем 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 файлам это могло быть тяжело. Любые приветствующиеся подсказки!

9
задан Blorgbeard 15 April 2014 в 20:43
поделиться

6 ответов

Спасибо всем за ваши предложения, я попробую их всех, чтобы изучить различные подходы. Решение, к которому я пришел, основано на использовании естественной сортировки в моем списке файлов, а затем повторении этого для переименования. Это был один из предложенных ответов, но по какой-то причине он исчез, поэтому я не могу отметить его как принятый!

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/

4
ответ дан 4 December 2019 в 12:16
поделиться

Почему бы вам не сделать это в два этапа. Разобрать все файлы и переименовать их, добавив номера, а затем запустить другой сценарий, который берет эти файлы, которые теперь отсортированы правильно, и переименовывает их, чтобы они были смежными?

1
ответ дан 4 December 2019 в 12:16
поделиться

1) Возьмите число в имени файла. 2) Заполните его нулями слева 3) Сохраните имя.

0
ответ дан 4 December 2019 в 12:16
поделиться

Есть три шага. Первый - получение всех имен файлов. Второй - преобразование имен файлов. Третий - их переименование.

Если все файлы находятся в одной папке, то 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)
4
ответ дан 4 December 2019 в 12:16
поделиться
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, ...) с прокладкой, как вы хотите, в имени назначения.

8
ответ дан 4 December 2019 в 12:16
поделиться
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"

Надеюсь, это поможет

0
ответ дан 4 December 2019 в 12:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: