Python:如何在所有文件、文件夹和子文件夹的名称中用下划线替换空格?

Posted

技术标签:

【中文标题】Python:如何在所有文件、文件夹和子文件夹的名称中用下划线替换空格?【英文标题】:Python: How to replace whitespaces by underscore in the name of ALL files, folders and subfolders? 【发布时间】: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('*')

【问题讨论】:

目标是什么——结果,还是程序本身? 您可以在此处的答案中使用 os.walk() :***.com/questions/16953842/… 【参考方案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 的文件)

以上是关于Python:如何在所有文件、文件夹和子文件夹的名称中用下划线替换空格?的主要内容,如果未能解决你的问题,请参考以下文章

如何扫描文件夹和子文件夹中的所有文件? [复制]

递归方法删除文件夹(包含所有文件和子文件)

bat命求助,如何删除文件夹和子文件夹中某个类型以外的所有文件。

如何从 Pentaho Kettle 读取所有文件夹和子文件夹 使用 SFTP 步骤获取文件

如何选择具有自定义文件结尾的任何层的所有文件夹和子文件夹?

如何使用 gsutil 将所有文件和子文件夹从当前目录复制/移动到 Google Cloud Storage 存储桶