Как я могу переименовать файлы с помощью скрипта Python?

На моем сайте plone у меня есть сотни файлов (pdf, doc, ...) в файловом поле объектов архетипов. Что-то пошло не так во время импорта, и все имена файлов отсутствуют. Проблема в том, что когда кто-то хочет открыть файл, поскольку расширение отсутствует, браузер не всегда предлагает открыть его с помощью программы просмотра.

Пользователь должен сохранить файл и добавить расширение, чтобы открыть его.

Могу ли я написать скрипт Python для переименования всех файлов с расширением в зависимости от типа файла?

Спасибо.


person user1035648    schedule 08.11.2011    source источник
comment
Просто примечание: браузеры обычно (или в основном) используют заголовки, чтобы определить, что делать с ресурсом. Так что правильное расширение может не помочь. Хотя, возможно, plone мог бы использовать его для установки правильных заголовков.   -  person rplnt    schedule 08.11.2011


Ответы (2)


http://plone.org/documentation/manual/plone-community-developer-documentation/content/rename

здесь есть все что нужно :)

Важная часть заключается в следующем: parent.manage_renameObject(id, id + "-old")

вы можете перебирать подобъекты, выполняя:

for i in context.objectIds():
 obj = context[i]
 context.manage_renameObject(i, i + ".pdf")

контекст - это папка, в которую вы поместили этот скрипт, папка, в которой у вас есть все ваши PDF-файлы.

person Yuri    schedule 08.11.2011
comment
я думаю, это может занять некоторое время, более сотни файлов. Вы также должны найти способ понять, является ли это документом или PDF. - person Yuri; 08.11.2011
comment
Кажется, что он переименовывает идентификатор моих файловых объектов, но не само имя файла. Мое имя файла остается пустым. - person user1035648; 14.11.2011
comment
имя файла должно брать имя из идентификатора объекта. Здесь: api.plone.org/Plone/ 2.1.1/public/ есть метод setFilename. Я думаю, вам нужно использовать внешний метод или представление браузера, чтобы вызвать его. Найдите Archetypes/BaseUnit.py, в поле с именем файла есть атрибут, который содержит имя. setFilename вызывается при обработке ввода, то есть при сохранении файла. - person Yuri; 29.11.2011

Стандартная библиотечная функция os.rename(src, dst) сделает свое дело. Это все, что вам нужно, если вы знаете, каким должно быть расширение (например, все файлы имеют формат .pdf). Если у вас смешанный пакет файлов .doc, .pdf, .jpg, .xls без расширений, вам нужно будет изучить содержимое файла, чтобы определить правильное расширение, используя что-то вроде python-magic.

import os

for fn in os.listdir(path='.'):
    os.rename(fn, fn + ".pdf")
person Dave    schedule 08.11.2011
comment
Это не файлы файловой системы, а объекты File на сайте Plone. :-) - person Martijn Pieters; 09.11.2011