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