python中的递归文件重命名
我正在尝试编写一些代码来递归地重命名python中的文件。我有一个根文件夹,里面有另一个文件夹,还有另一个文件夹。每个文件夹都有一个名为“Name.txt”的文件,我想将它们改为“Test.txt”,以便了解os.walk()和os.rename()的工作原理。我编写了以下代码: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)
# -*- 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
,请参见()您不应该使用更新的代码发布答案。使用更新编辑原始问题并删除“答案”,因为它们不会回答问题。