Пакетное переименование файлов в каталоге

Есть ли простой способ переименовать группу файлов, уже содержащихся в каталоге, используя Python?

Пример: у меня есть каталог, полный файлов * .doc, и я хочу переименовать их последовательно.

X.doc -> "new (X) .doc"

Y.doc -> "new (Y) .doc"

8 Solutions collect form web for “Пакетное переименование файлов в каталоге”

Такое переименование довольно просто, например, с модулями os и glob :

import glob, os def rename(dir, pattern, titlePattern): for pathAndFilename in glob.iglob(os.path.join(dir, pattern)): title, ext = os.path.splitext(os.path.basename(pathAndFilename)) os.rename(pathAndFilename, os.path.join(dir, titlePattern % title + ext)) 

Затем вы можете использовать его в своем примере следующим образом:

 rename(r'c:\temp\xx', r'*.doc', r'new(%s)') 

Вышеприведенный пример преобразует все файлы *.doc в *.doc c:\temp\xx в new(%s).doc , где %s – это предыдущее базовое имя файла (без расширения).

Я предпочитаю писать небольшие вкладыши для каждой замены, которую я должен сделать, вместо того, чтобы создавать более общий и сложный код. Например:

Это заменяет все символы подчеркивания на дефисы в любом не скрытом файле в текущем каталоге

 import os [os.rename(f, f.replace('_', '-')) for f in os.listdir('.') if not f.startswith('.')] 

Если вы не возражаете использовать регулярные выражения, эта функция даст вам много возможностей для переименования файлов:

 import re, glob, os def renamer(files, pattern, replacement): for pathname in glob.glob(files): basename= os.path.basename(pathname) new_filename= re.sub(pattern, replacement, basename) if new_filename != basename: os.rename( pathname, os.path.join(os.path.dirname(pathname), new_filename)) к import re, glob, os def renamer(files, pattern, replacement): for pathname in glob.glob(files): basename= os.path.basename(pathname) new_filename= re.sub(pattern, replacement, basename) if new_filename != basename: os.rename( pathname, os.path.join(os.path.dirname(pathname), new_filename)) 

Итак, в вашем примере вы могли бы сделать (предполагая, что это текущий каталог, где находятся файлы):

 renamer("*.doc", r"^(.*)\.doc$", r"new(\1).doc") 

но вы также можете вернуться к исходным именам файлов:

 renamer("*.doc", r"^new\((.*)\)\.doc", r"\1.doc") 

и более.

У меня есть это, чтобы просто переименовать все файлы в подпапках папки

 import os def replace(fpath, old_str, new_str): for path, subdirs, files in os.walk(fpath): for name in files: if(old_str.lower() in name.lower()): os.rename(os.path.join(path,name), os.path.join(path, name.lower().replace(old_str,new_str))) 

Я заменяю все вхождения old_str любым случаем new_str.

Попробуйте: http://www.mattweber.org/2007/03/04/python-script-renamepy/

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

Эта программа может преобразовать имя файла во все строчные буквы, заменить строки в имени файла тем, что вы хотите, и обрезать любое количество символов с лицевой или обратной стороны имени файла.

Также доступен исходный код программы.

Я написал сценарий python самостоятельно. В качестве аргументов он принимает путь к каталогу, в котором находятся файлы, и шаблону именования, который вы хотите использовать. Однако он переименовывает, добавляя инкрементное число (1, 2, 3 и т. Д.) К шаблону именования, который вы даете.

 import os import sys # checking whether path and filename are given. if len(sys.argv) != 3: print "Usage : python rename.py <path> <new_name.extension>" sys.exit() # splitting name and extension. name = sys.argv[2].split('.') if len(name) < 2: name.append('') else: name[1] = ".%s" %name[1] # to name starting from 1 to number_of_files. count = 1 # creating a new folder in which the renamed files will be stored. s = "%s/pic_folder" % sys.argv[1] try: os.mkdir(s) except OSError: # if pic_folder is already present, use it. pass try: for x in os.walk(sys.argv[1]): for y in x[2]: # creating the rename pattern. s = "%spic_folder/%s%s%s" %(x[0], name[0], count, name[1]) # getting the original path of the file to be renamed. z = os.path.join(x[0],y) # renaming. os.rename(z, s) # incrementing the count. count = count + 1 except OSError: pass 

Надеюсь, что это работает для вас.

 directoryName = "Photographs" filePath = os.path.abspath(directoryName) filePathWithSlash = filePath + "\\" for counter, filename in enumerate(os.listdir(directoryName)): filenameWithPath = os.path.join(filePathWithSlash, filename) os.rename(filenameWithPath, filenameWithPath.replace(filename,"DSC_" + \ str(counter).zfill(4) + ".jpg" )) # eg filename = "photo1.jpg", directory = "c:\users\Photographs" # The string.replace call swaps in the new filename into # the current filename within the filenameWitPath string. Which # is then used by os.rename to rename the file in place, using the # current (unmodified) filenameWithPath. # os.listdir delivers the filename(s) from the directory # however in attempting to "rename" the file using os # a specific location of the file to be renamed is required. # this code is from Windows 

как мне в моем каталоге у меня есть несколько subdir, каждый subdir имеет много изображений, я хочу изменить все изображения subdir на 1.jpg ~ n.jpg

 def batch_rename(): base_dir = 'F:/ad_samples/test_samples/' sub_dir_list = glob.glob(base_dir + '*') # print sub_dir_list # like that ['F:/dir1', 'F:/dir2'] for dir_item in sub_dir_list: files = glob.glob(dir_item + '/*.jpg') i = 0 for f in files: os.rename(f, os.path.join(dir_item, str(i) + '.jpg')) i += 1 

(mys собственный ответ) https://stackoverflow.com/a/45734381/6329006

 
Interesting Posts for Van-Lav

Почему ссылки на атрибуты действуют так, как наследование Python?

Как преобразовать объект datetime.date в datetime.datetime в python?

Appengine remote_api_shell не работает с учетными данными приложения по умолчанию с момента обновления

Python urllib.request и вопрос об декодировании utf8

Числовое значение непосредственно после обратной ссылки

как поймать все неискушенные исключения и продолжить?

socket.error: Разрешение отклонено при создании поддельного почтового сервера

Как заменить все записи, отличные от NaN, на единицу данных с 1 и все NaN с помощью 0

Есть ли декоратор, чтобы просто кэшировать возвращаемые значения функции?

QMetaObject :: invokeMethod не находит методы с параметрами

bpython-подобный автозаполнение и описание параметров в Emacs Python Mode?

Установка pyside с python3 на os x

как изменить столбец Dataframe из типа String в Double type в pyspark

pandas падает при повторном DataFrame.reset_index ()

Проблема с запуском учебного пособия Heroku в Facebook с Python

Python - лучший язык программирования в мире.