python中的递归文件重命名

python中的递归文件重命名,python,recursion,Python,Recursion,我正在尝试编写一些代码来递归地重命名python中的文件。我有一个根文件夹,里面有另一个文件夹,还有另一个文件夹。每个文件夹都有一个名为“Name.txt”的文件,我想将它们改为“Test.txt”,以便了解os.walk()和os.rename()的工作原理。我编写了以下代码: # -*- coding: utf-8 -*- import os def renamefiles(path): rootstructure=os.walk(path,topdown=False)

我正在尝试编写一些代码来递归地重命名python中的文件。我有一个根文件夹,里面有另一个文件夹,还有另一个文件夹。每个文件夹都有一个名为“Name.txt”的文件,我想将它们改为“Test.txt”,以便了解os.walk()和os.rename()的工作原理。我编写了以下代码:

# -*- coding: utf-8 -*-

import os


def renamefiles(path):

    rootstructure=os.walk(path,topdown=False)
    for root,dirs,files in os.walk(rootstructure):

        for filenames in files:

        fullfilename=os.path.abspath(filenames)

        os.rename(fullfilename,"Test.txt")



renamefiles(".")
但是,我得到了这个错误:

File "/usr/lib/python2.7/os.py", line 278, in walk
names = listdir(top)
TypeError: coercing to Unicode: need string or buffer, generator found
我做错了什么


提前感谢。

操作系统。重命名可能具有破坏性。小心使用它

出于某种原因,您已将
rootstructure
初始化为os.walk。您需要将其初始化为当前目录的路径

import os

def renamefiles(path):
    rootstructure=os.path.abspath(path)

    for root,dirs,files in os.walk(rootstructure):
        for filenames in files:
            fullfilename=os.path.abspath(filenames)
            print(fullfilename)
            # Use this carefuly, it can wipe off your entire system
            # if not used carefully
            os.rename(fullfilename,"Test.txt")

renamefiles(".")

os.rename
可能具有破坏性。小心使用它

出于某种原因,您已将
rootstructure
初始化为os.walk。您需要将其初始化为当前目录的路径

import os

def renamefiles(path):
    rootstructure=os.path.abspath(path)

    for root,dirs,files in os.walk(rootstructure):
        for filenames in files:
            fullfilename=os.path.abspath(filenames)
            print(fullfilename)
            # Use this carefuly, it can wipe off your entire system
            # if not used carefully
            os.rename(fullfilename,"Test.txt")

renamefiles(".")

您需要传递一个字符串,该字符串表示到
os.walk
的路径。当前,您正在传递
rootstructure
,它是一个生成器对象

def renamefiles(path):
    for root,dirs,files in os.walk(path):
        for filenames in files:
            fullfilename=os.path.abspath(filenames)

            # YOU PROBABLY WANT TO CHECK THE FILENAME BEFORE RENAMING!
            # WHAT IF THE FILE IS NOT Name.txt !
            os.rename(fullfilename,"Test.txt")

renamefiles(".")

您需要传递一个字符串,该字符串表示到
os.walk
的路径。当前,您正在传递
rootstructure
,它是一个生成器对象

def renamefiles(path):
    for root,dirs,files in os.walk(path):
        for filenames in files:
            fullfilename=os.path.abspath(filenames)

            # YOU PROBABLY WANT TO CHECK THE FILENAME BEFORE RENAMING!
            # WHAT IF THE FILE IS NOT Name.txt !
            os.rename(fullfilename,"Test.txt")

renamefiles(".")
总结 建议的修改如下:

  • 使用
    os.getcwd()
    而不是
    ”,因为它似乎没有按照您想要的方式进行解析。这将在诊断功能中说明
  • 通过
    os.chdir(root)
    使用相对路径重命名。当然,使用正确的绝对路径也有效,但IMHO相对路径更优雅
  • 将一个明确的字符串传递到
    os.walk()
    中,正如其他人所提到的
还要注意的是,
os.walk()
中的
top-down=False
并不重要。由于您没有重命名目录,因此在
os.walk()
期间目录结构将保持不变

代码示例 原始文件结构:

bill@Bill-deb:/mnt/ramdisk/test$ tree .
.
├── outer
│   ├── inner
│   │   └── innermost.txt
│   └── inner.txt
├── outer.txt
└── rename.py
bill@Bill-deb:/mnt/ramdisk/test$ tree .
.
├── outer
│   ├── inner
│   │   └── renamed.txt
│   └── renamed.txt
├── renamed.txt
└── rename.py
代码:

结果文件结构:

bill@Bill-deb:/mnt/ramdisk/test$ tree .
.
├── outer
│   ├── inner
│   │   └── innermost.txt
│   └── inner.txt
├── outer.txt
└── rename.py
bill@Bill-deb:/mnt/ramdisk/test$ tree .
.
├── outer
│   ├── inner
│   │   └── renamed.txt
│   └── renamed.txt
├── renamed.txt
└── rename.py
在debian 8.6 64位、python 2.7.12(Anaconda 4.1.1)下测试

诊断用
重命名文件检查(“.”
的前几行如下所示:

os.getcwd() = /mnt/ramdisk/test
root = ./outer/inner
f = innermost.txt
os.path.abspath(f) = /mnt/ramdisk/test/innermost.txt
os.path.join(root, f) = ./outer/inner/innermost.txt
您可以验证:

  • 行为
    os.path.abspath(f)
    是不可取的(更不用说它是错误的)。它总是绑定到传递到
    os.walk()
    的参数
    path
    ,而不是包含文件
    f
    的路径

  • 作为
    path
    传递时,
    os.path.join(root,f)
    中的点仍未完全解析

示例代码避免了这些歧义。

Summary 建议的修改如下:

  • 使用
    os.getcwd()
    而不是
    ”,因为它似乎没有按照您想要的方式进行解析。这将在诊断功能中说明
  • 通过
    os.chdir(root)
    使用相对路径重命名。当然,使用正确的绝对路径也有效,但IMHO相对路径更优雅
  • 将一个明确的字符串传递到
    os.walk()
    中,正如其他人所提到的
还要注意的是,
os.walk()
中的
top-down=False
并不重要。由于您没有重命名目录,因此在
os.walk()
期间目录结构将保持不变

代码示例 原始文件结构:

bill@Bill-deb:/mnt/ramdisk/test$ tree .
.
├── outer
│   ├── inner
│   │   └── innermost.txt
│   └── inner.txt
├── outer.txt
└── rename.py
bill@Bill-deb:/mnt/ramdisk/test$ tree .
.
├── outer
│   ├── inner
│   │   └── renamed.txt
│   └── renamed.txt
├── renamed.txt
└── rename.py
代码:

结果文件结构:

bill@Bill-deb:/mnt/ramdisk/test$ tree .
.
├── outer
│   ├── inner
│   │   └── innermost.txt
│   └── inner.txt
├── outer.txt
└── rename.py
bill@Bill-deb:/mnt/ramdisk/test$ tree .
.
├── outer
│   ├── inner
│   │   └── renamed.txt
│   └── renamed.txt
├── renamed.txt
└── rename.py
在debian 8.6 64位、python 2.7.12(Anaconda 4.1.1)下测试

诊断用
重命名文件检查(“.”
的前几行如下所示:

os.getcwd() = /mnt/ramdisk/test
root = ./outer/inner
f = innermost.txt
os.path.abspath(f) = /mnt/ramdisk/test/innermost.txt
os.path.join(root, f) = ./outer/inner/innermost.txt
您可以验证:

  • 行为
    os.path.abspath(f)
    是不可取的(更不用说它是错误的)。它总是绑定到传递到
    os.walk()
    的参数
    path
    ,而不是包含文件
    f
    的路径

  • 作为
    path
    传递时,
    os.path.join(root,f)
    中的点仍未完全解析


示例代码避免了这些歧义。

您没有正确使用
os.walk
,请参见()您不应该在更新的代码中发布答案。使用您的更新编辑原始问题,并删除“答案”,因为它们不会回答问题。您没有正确使用
os.walk
,请参见()您不应该使用更新的代码发布答案。使用更新编辑原始问题并删除“答案”,因为它们不会回答问题。