在Python中重命名一个目录中的多个文件

我正在尝试使用Python重命名目录中的某些文件。

假设我有一个名为CHEESE_CHEESE_TYPE.***的文件,并想删除CHEESE_所以我的结果文件名是CHEESE_TYPE

我试图使用os.path.split但它不能正常工作。 我也考虑过使用string操作,但是还没有成功。

使用os.rename(src, dst)重命名或移动文件或目录。

 $ ls cheese_cheese_type.bar cheese_cheese_type.foo $ python >>> import os >>> for filename in os.listdir("."): ... if filename.startswith("cheese_"): ... os.rename(filename, filename[7:]) ... >>> $ ls cheese_type.bar cheese_type.foo 

这是一个基于你最新评论的脚本。

 #!/usr/bin/env python from os import rename, listdir badprefix = "cheese_" fnames = listdir('.') for fname in fnames: if fname.startswith(badprefix*2): rename(fname, fname.replace(badprefix, '', 1)) 

假设你已经在目录中,并且你的注释中的“前8个字符”始终保持为真。 (虽然“CHEESE_”是7个字符?如果是,请将下面的8改为7)

 from glob import glob from os import rename for fname in glob('*.prj'): rename(fname, fname[8:]) 

下面的代码应该工作。 它采用当前目录中的每个文件名,如果文件名包含模式CHEESE_CHEESE_则将其重命名。 如果不是没有做任何事情的文件名。

 import os for fileName in os.listdir("."): os.rename(fileName, fileName.replace("CHEESE_CHEESE_", "CHEESE_")) 

尝试这个:

 import os import shutil for file in os.listdir(dirpath): newfile = os.path.join(dirpath, file.split("_",1)[1]) shutil.move(os.path.join(dirpath,file),newfile) 

我假设你不想删除文件扩展名,但你可以做同样的分裂与句点。

我有同样的问题,我想在哪里取代空格 在任何pdf文件到破折号- 。 但是这些文件在多个子目录中。 所以,我不得不使用os.walk() 。 在你的情况下,多个子目录,可能是这样的:

 import os for dpath, dnames, fnames in os.walk('/path/to/directory'): for f in fnames: os.chdir(dpath) if f.startswith('cheese_'): os.rename(f, f.replace('cheese_', '')) 

这种东西是非常适合IPython,它具有壳集成。

 In [1] files = !ls In [2] for f in files: newname = process_filename(f) mv $f $newname 

注意:要将其存储在脚本中,请使用.ipy扩展名,并将所有shell命令加上前缀!

另见: http : //ipython.org/ipython-doc/stable/interactive/shell.html

看来你的问题更多的是确定新的文件名,而不是重命名本身(你可以使用os.rename方法)。

从你的问题中不清楚你想要重命名的模式是什么。 string操作没有错。 正则expression式可能是你在这里需要的。

这个命令将从当前目录中的所有文件中删除初始的 “CHEESE_”string,使用重命名 :

 $ renamer --regex --find "^CHEESE_" * 

这是一个更一般的解决scheme:

此代码可用于从目录中的所有文件名中recursion地删除任何特定字符或字符集,并将其replace为任何其他字符,字符集或无字符。

 import os paths = (os.path.join(root, filename) for root, _, filenames in os.walk('C:\FolderName') for filename in filenames) for path in paths: # the '#' in the example below will be replaced by the '-' in the filenames in the directory newname = path.replace('#', '-') if newname != path: os.rename(path, newname) 

您可以使用os.system函数来简化并调用bash来完成任务:

 import os os.system('mv old_filename new_filename') 

那这个呢 :

 import re p = re.compile(r'_') p.split(filename, 1) #where filename is CHEESE_CHEESE_TYPE.*** 

我最初正在寻找一些GUI,允许使用正则expression式进行重命名,并在应用更改之前预览了结果。

在Linux上,我已经成功地使用krename ,在Windows Total Commander用正则expression式重命名,但我发现没有像样的自由等效的OSX,所以我最终编写了一个recursion的Python脚本,默认情况下只打印新的文件名而不做任何变化。 添加'-w'开关来实际修改文件名。

 #!/usr/bin/python # -*- coding: utf-8 -*- import os import fnmatch import sys import shutil import re def usage(): print """ Usage: %s <work_dir> <search_regex> <replace_regex> [-w|--write] By default no changes are made, add '-w' or '--write' as last arg to actually rename files after you have previewed the result. """ % (os.path.basename(sys.argv[0])) def rename_files(directory, search_pattern, replace_pattern, write_changes=False): pattern_old = re.compile(search_pattern) for path, dirs, files in os.walk(os.path.abspath(directory)): for filename in fnmatch.filter(files, "*.*"): if pattern_old.findall(filename): new_name = pattern_old.sub(replace_pattern, filename) filepath_old = os.path.join(path, filename) filepath_new = os.path.join(path, new_name) if not filepath_new: print 'Replacement regex {} returns empty value! Skipping'.format(replace_pattern) continue print new_name if write_changes: shutil.move(filepath_old, filepath_new) else: print 'Name [{}] does not match search regex [{}]'.format(filename, search_pattern) if __name__ == '__main__': if len(sys.argv) < 4: usage() sys.exit(-1) work_dir = sys.argv[1] search_regex = sys.argv[2] replace_regex = sys.argv[3] write_changes = (len(sys.argv) > 4) and sys.argv[4].lower() in ['--write', '-w'] rename_files(work_dir, search_regex, replace_regex, write_changes) 

示例用例

我想以下列方式翻转文件名的一部分, m7-08到文件名的开头:

 # Before: Summary-building-mobile-apps-ionic-framework-angularjs-m7-08.mp4 # After: m7-08_Summary-building-mobile-apps-ionic-framework-angularjs.mp4 

这将执行干运行,并打印新的文件名称,而不实际重命名任何文件:

 rename_files_regex.py . "([^\.]+?)-(m\\d+-\\d+)" "\\2_\\1" 

这将做实际的重命名(你可以使用-w--write ):

 rename_files_regex.py . "([^\.]+?)-(m\\d+-\\d+)" "\\2_\\1" --write 

import os import string def rename_files():

 #List all files in the directory file_list = os.listdir("/Users/tedfuller/Desktop/prank/") print(file_list) #Change current working directory and print out it's location working_location = os.chdir("/Users/tedfuller/Desktop/prank/") working_location = os.getcwd() print(working_location) #Rename all the files in that directory for file_name in file_list: os.rename(file_name, file_name.translate(str.maketrans("","",string.digits))) 

rename_files()

这对我有用。

 import os for afile in os.listdir('.'): filename, file_extension = os.path.splitext(afile) if not file_extension == '.xyz': os.rename(afile, filename + '.abc')