【问题标题】:Python: How to replace whitespaces by underscore in the name of ALL files, folders and subfolders?Python:如何在所有文件、文件夹和子文件夹的名称中用下划线替换空格?
【发布时间】:2017-05-01 18:50:04
【问题描述】:

我们如何替换给定父文件夹中文件夹、子文件夹和文件名称中的空格?

下面给出了我最初尝试替换到 8 级的尝试。我相信有更好的方法。我的代码看起来很难看。 我们非常欢迎更好的解决方案。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#


def replace_space_by_underscore(path):
    """Replace whitespace in filenames by underscore."""
    import glob
    import os
    for infile in glob.glob(path):
        new = infile.replace(" ", "_")
        try:
            new = new.replace(",", "_")
        except:
            pass
        try:
            new = new.replace("&", "_and_")
        except:
            pass
        try:
            new = new.replace("-", "_")
        except:
            pass
        if infile != new:
            print(infile, "==> ", new)
        os.rename(infile, new)

if __name__ == "__main__":
    try:
        replace_space_by_underscore('*/*/*/*/*/*/*/*')
    except:
        pass
    try:
        replace_space_by_underscore('*/*/*/*/*/*/*')
    except:
        pass
    try:
        replace_space_by_underscore('*/*/*/*/*/*')
    except:
        pass
    try:
        replace_space_by_underscore('*/*/*/*/*')
    except:
        pass
    try:
        replace_space_by_underscore('*/*/*/*')
    except:
        pass
    try:
        replace_space_by_underscore('*/*/*')
    except:
        pass
    try:
        replace_space_by_underscore('*/*')
    except:
        replace_space_by_underscore('*')

【问题讨论】:

标签: python batch-rename


【解决方案1】:

您可以使用os.walk 即时更改迭代文件夹的名称:

import os

def replace(parent):
    for path, folders, files in os.walk(parent):
        for f in files:
            os.rename(os.path.join(path, f), os.path.join(path, f.replace(' ', '_')))
        for i in range(len(folders)):
            new_name = folders[i].replace(' ', '_')
            os.rename(os.path.join(path, folders[i]), os.path.join(path, new_name))
            folders[i] = new_name

os.walk 以自上而下的顺序从parent 开始迭代目录树。对于每个文件夹,它返回元组(current path, list of files, list of folders)。给定的文件夹列表可以改变,os.walk 将在以下迭代步骤中使用改变的内容。

运行前的文件夹:

.
├── new doc
└── sub folder
    ├── another folder
    ├── norename
    └── space here

之后:

.
├── new_doc
└── sub_folder
    ├── another_folder
    ├── norename
    └── space_here

【讨论】:

  • 能够使用os.rename 作为重命名文件的方法对我有帮助,谢谢
【解决方案2】:

您需要一个递归解决方案。重命名当前目录下的所有文件;然后对于每个子目录(如果有),下降到该子目录 X(使用 os.chdir(X)),再次调用相同的函数,然后返回到父目录(使用 os.chdir(".."))。

【讨论】:

    【解决方案3】:

    按照@niemmi 的确切想法,我最终得到了这个:

    警告:切勿从 HOME 目录或某些重要目录运行此脚本,它会重命名所有文件,包括隐藏文件。

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    # Date: Dec 15, 2016
    
    
    def replace_space_by_underscore(parent):
        """Replace whitespace by underscore in all files and folders.
    
        replaces    , - [ ] () __   ==>  underscore
    
        """
        import os
        for path, folders, files in os.walk(parent):
            # rename the files
            for f in files:
                old = os.path.join(path, f)
                bad_chars = [r' ', r',', r'-', r'&', r'[', r']', r'(', r')', r'__']
                for bad_char in bad_chars:
                    if bad_char in f:
                        new = old.replace(bad_char, '_')
                        print(old, "==>", new)
                        os.rename(old, new)
    
            # rename the folders
            for i in range(len(folders)):
                new_name = folders[i].replace(' ', '_')
                bad_chars = [r' ', r',', r'-', r'&',
                             r'[', r']', r'(', r')', r'__']
                for bad_char in bad_chars:
                    if bad_char in new_name:
                        new_name = new_name.replace(bad_char, '_')
                        print(folders[i], "==> ", new_name)
                old = os.path.join(path, folders[i])
                new = os.path.join(path, new_name)
                os.rename(old, new)
                folders[i] = new_name
    
    
    if __name__ == "__main__":
        replace_space_by_underscore('.')
    

    【讨论】:

    • 好的解决方案 - 只需要在文件中的os.rename(old, new) 下的old = new for 循环(即:具有多个bad_chars 的文件)
    猜你喜欢
    • 2014-01-14
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多