我试图用Python重命名目录中的一些文件。
假设我有一个名为CHEESE_CHEESE_TYPE的文件。***,并希望删除CHEESE_,因此我的结果文件名将是CHEESE_TYPE
我正在尝试使用os.path.split,但它不能正常工作。我也考虑过使用字符串操作,但也没有成功。
我试图用Python重命名目录中的一些文件。
假设我有一个名为CHEESE_CHEESE_TYPE的文件。***,并希望删除CHEESE_,因此我的结果文件名将是CHEESE_TYPE
我正在尝试使用os.path.split,但它不能正常工作。我也考虑过使用字符串操作,但也没有成功。
当前回答
这个命令将使用重命名器从当前目录下的所有文件中删除初始的"CHEESE_"字符串:
$ renamer --find "/^CHEESE_/" *
其他回答
我有同样的问题,我想在任何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_', ''))
我最初是在寻找一些GUI,它允许使用正则表达式重命名,并在应用更改之前预览结果。
在Linux上,我成功地使用了krename,在Windows上,Total Commander使用regex重命名,但我发现OSX没有像样的免费等效物,所以我最终写了一个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
这个命令将使用重命名器从当前目录下的所有文件中删除初始的"CHEESE_"字符串:
$ renamer --find "/^CHEESE_/" *
使用操作系统。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
下面的代码应该可以工作。它接受当前目录中的每个文件名,如果文件名包含模式CHEESE_CHEESE_,那么它将被重命名。如果不是,则不对文件名进行任何操作。
import os
for fileName in os.listdir("."):
os.rename(fileName, fileName.replace("CHEESE_CHEESE_", "CHEESE_"))