使用python和os.walk()重命名子文件夹中的文件

使用python和os.walk()重命名子文件夹中的文件,python,python-3.x,rename,os.walk,Python,Python 3.x,Rename,Os.walk,我想重命名两个父目录子文件夹中的所有文件,用下划线替换空格。这是我的结构: parent folder folder 1 TIFF image 1 image 2 [...] folder 2 TIFF image 1 image 2 [...] [...] 这就是我想要的结果: pa

我想重命名两个父目录子文件夹中的所有文件,用下划线替换空格。这是我的结构:

parent folder
    folder 1
        TIFF
             image 1
             image 2
             [...]
    folder 2
        TIFF
             image 1
             image 2
             [...]
    [...]
这就是我想要的结果:

parent folder
    folder_1
        TIFF
             image_1
             image_2
             [...]
    folder_2
        TIFF
             image_1
             image_2
             [...]
    [...]
这是我正在使用的脚本,到目前为止,它没有做任何事情:

#!/usr/local/bin/python3

import os

def replace(parent):
    for path, folders, files in os.walk(parent):

        for i in range(len(folders)):
            os.chdir("TIFF")
            for f in files:
                os.rename(os.path.join(path, f), os.path.join(path, f.replace(' ', '_')))
            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
完成遍历之前,您可能遇到了重命名文件夹的问题。这可以通过设置
top-down=False
来解决。现在,您将首先收到最低的文件和文件夹

然后可以先更新文件,然后更新文件夹

import os


def rename(path, file):
    old_file = os.path.join(path, file)
    new_file = os.path.join(path, file.replace(' ', '_'))
    os.rename(old_file, new_file)


def replace(parent):
    for path, folders, files in os.walk(parent, topdown=False):
        print(path, folders, files)
        for file in files:
            rename(path, file)
        for folder in folders:
            rename(path, folder)
编辑 以下结构和代码用于测试脚本:

  • 文件夹结构
  • 代码main.py
os.walk()
内部执行
os.chdir()
几乎肯定是错误的

此外,在遍历父目录的子目录时,请注意不要重命名父目录

#/usr/local/bin/python3
导入操作系统
def替换(父级):
回忆=[]
对于os.walk(父级)中的路径、文件夹和文件:
如果os.path.basename(路径)=“TIFF”:
对于文件中的f:
重命名(os.path.join(path,f),os.path.join(path,f.replace(“”“”))
文件夹中的elif“TIFF”:
append((path,os.path.join(os.path.dirname(path),os.path.basename(path.replace(“,”)))
对于src,dst在纪念中:
重命名(src,dst)
您的代码从不调用
replace()
,因此这可能是您缺少的第一件事。声明一个函数只是告诉Python在以后调用该函数时应该做什么

如果你真的不需要递归,那就去做吧

导入操作系统
导入glob
def下划线(路径):
重命名(path,os.path.join(os.path.dirname(path),os.path.basename(path).replace(“,”))
对于glob.glob(“*/TIFF/*”)中的文件:
下划线(文件)
对于glob.glob(“*/”)中的目录名:
如果os.path.exists(os.path.join(dirname),“TIFF”):
下划线(dirname)

当您使用
os.chdir
方法时,由于您的工作目录总是在更改,您应该使用
os.getcwd
查看当前的工作目录,您将知道有什么问题,然后首先将工作目录更改为父目录,然后您可以根据需要更改它。

当您运行代码时会发生什么情况?它没有作用吗正在初始化、发出错误等?谢谢。因此,我正在从“父文件夹”启动脚本。该脚本只是存在,没有返回任何错误,也没有执行任何操作。文件的名称仍与以前一样。您的代码不会更改为TIFF目录。我将添加测试结构,以便您知道我是如何测试它的。我担心该脚本仍然没有为我执行任何操作。我将从“父”目录的内部启动它。只是为了确保我在它的顶部添加了一个“print('hello')”,它会打印出来。如果从父级运行(与文件夹处于同一级别),您只需使用
replace(os.path.dirname(_文件__))即可
。我刚检查过,它对我有效。为什么要使用脚本的目录作为目录的起点?让它遍历用户的当前工作目录更通用,也不那么令人惊讶。这也没什么作用。我正在从父文件夹启动它。这段代码(第一个)有效吗深入了解文件夹结构?这就是
os.walk()
所做的;它从一个特定目录开始遍历整个目录树。我稍微更新了答案,并提供了一个演示:Python已经知道它在哪个目录中;您基本上不需要
os.getcwd()
除非您出于某种原因需要知道当前工作目录的绝对路径。我认为工作目录是脚本运行的地方,但它可能不是“父”目录。
└───parent
    ├───folder 1
    │   └───TIFF
    │         ├─── file 1.txt
    │         └─── file 2.txt
    ├───folder 2
    │    └───TIFF
    │         ├─── file 1.txt
    │         └─── file 2.txt
    └─── main.py

import os


def rename(path, file):
    old_file = os.path.join(path, file)
    new_file = os.path.join(path, file.replace(' ', '_'))
    os.rename(old_file, new_file)


def replace(parent):
    for path, folders, files in os.walk(parent, topdown=False):
        print(path, folders, files)
        for file in files:
            rename(path, file)
        for folder in folders:
            rename(path, folder)


if __name__ == '__main__':
    parent = os.path.dirname(__file__)
    replace(os.path.join(parent, 'parent'))