批量重命名目录中的文件

有没有一种简单的方法来重命名已经包含在目录中的一组文件,使用Python?

例如:我有一个目录充满了* .doc文件,我想以一致的方式重命名它们。

X.doc – >“new(X).doc”

Y.doc – >“new(Y).doc”

这样的重命名很容易,例如使用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)') 

上面的例子会将c:\temp\xx dir中的所有*.doc文件转换为new(%s).doc ,其中%s是文件的前一个基本名称(不带扩展名)。

我更喜欢为每个替代品写一个小的内衬,而不是制作更通用和更复杂的代码。 例如:

这将在当前目录中的任何非隐藏文件中用连字符replace所有下划线

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

如果你不介意使用正则expression式,那么这个函数会为你重命名文件提供很大的帮助:

 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))) 

我用new_strreplace了所有old_str的情况。

试试: http : //www.mattweber.org/2007/03/04/python-script-renamepy/

我喜欢以某种方式命名我的音乐,电影和图片文件。 当我从互联网下载文件时,他们通常不遵循我的命名惯例。 我发现自己手动重命名每个文件,以适应我的风格。 这真是老了,所以我决定写一个程序来为我做。

这个程序可以将文件名全部转换为小写,用任何你想要的replace文件名中的string,并修整文件名前面或后面的任意数量的字符。

该程序的源代码也可用。

我自己写了一个python脚本。 它以文件所在目录的path和要使用的命名模式作为参数。 但是,它通过附加一个增量数字(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 

我有一个类似的问题,但我想附加文本到目录中的所有文件的文件名的开头,并使用类似的方法。 看下面的例子:

folder = r“R:\ mystuff \ GIS_Projects \ Website \ 2017 \ PDF”

import操作系统

为root,dirs,os.walk(文件夹)中的文件名:

 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])) 

至于我在我的目录中,我有多个子目录,每个子目录有很多的图像,我想改变所有的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