Пакетное переименование файлов в каталоге
есть ли простой способ переименовать группу файлов, уже содержащихся в каталоге, с помощью Python?
пример: у меня есть каталог полный *.doc-файлы, и я хочу, чтобы переименовать их соответствующим образом.
X.doc - > " new (X).док"
Y.doc - > " новый (Y).док"
11 ответов:
такое переименование довольно легко, например с os и Глоб:
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файлыc:\temp\xxdir tonew(%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))Так что в вашем примере, вы могли бы сделать (предполагая, что это текущий каталог, где находятся файлы):
renamer("*.doc", r"^(.*)\.doc$", r"new().doc")но вы также можете вернуться к первоначальной имен:
renamer("*.doc", r"^new\((.*)\)\.doc", r".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" )) # e.g. 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
У меня была аналогичная проблема, но я хотел добавить текст в начало имени файла всех файлов в каталоге и использовал аналогичный метод. Смотрите пример ниже:
folder = r"R:\mystuff\GIS_Projects\Website17\PDF" import os for root, dirs, filenames in os.walk(folder): for filename in filenames: fullpath = os.path.join(root, filename) filename_split = os.path.splitext(filename) # filename will be filename_split[0] and extension will be filename_split[1]) print fullpath print filename_split[0] print filename_split[1] os.rename(os.path.join(root, filename), os.path.join(root, "NewText_2017_" + filename_split[0] + filename_split[1]))
# another regex version # usage example: # replacing an underscore in the filename with today's date # rename_files('..\output', '(.*)(_)(.*\.CSV)', '\g<1>_20180402_\g<3>') def rename_files(path, pattern, replacement): for filename in os.listdir(path): if re.search(pattern, filename): new_filename = re.sub(pattern, replacement, filename) new_fullname = os.path.join(path, new_filename) old_fullname = os.path.join(path, filename) os.rename(old_fullname, new_fullname) print('Renamed: ' + old_fullname + ' to ' + new_fullname
как мне в мой каталог у меня есть несколько подкаталогов, в каждом подкаталоге есть много изображений, которые я хочу изменить все каталогом изображений 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(мой собственный ответ)https://stackoverflow.com/a/45734381/6329006
находиться в директории, где нужно выполнить переименование.
import os # get the file name list to nameList nameList = os.listdir() #loop through the name and rename for fileName in nameList: rename=fileName[15:28] os.rename(fileName,rename) #example: #input fileName bulk like :20180707131932_IMG_4304.JPG #output renamed bulk like :IMG_4304.JPG
Comments