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

Есть ли простой способ переименовать группу файлов, уже содержащихся в каталоге, используя 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

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