我试图用Python重命名目录中的一些文件。

假设我有一个名为CHEESE_CHEESE_TYPE的文件。***,并希望删除CHEESE_,因此我的结果文件名将是CHEESE_TYPE

我正在尝试使用os.path.split,但它不能正常工作。我也考虑过使用字符串操作,但也没有成功。


当前回答

进口操作系统 进口的字符串 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
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)

我假设您不想删除文件扩展名,但您可以对句号进行相同的分割。

这个命令将使用重命名器从当前目录下的所有文件中删除初始的"CHEESE_"字符串:

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

你可以使用os。系统函数的简单性和调用bash来完成任务:

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

我有同样的问题,我想在任何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