【问题标题】:How to recursively loop through a file structure and rename directories in python如何递归循环遍历文件结构并在python中重命名目录
【发布时间】:2012-01-10 00:19:42
【问题描述】:

我想通过将最后一个字符更改为小写(如果是字母)来递归地重命名目录

我在以前的帖子的帮助下完成了这项工作(抱歉重复发帖而不承认答案)

此代码适用于文件,但我如何使其也适用于目录?

import fnmatch
import os


def listFiles(dir):
    rootdir = dir
    for root, subFolders, files in os.walk(rootdir):
        for file in files:
            yield os.path.join(root,file)
    return


for f in listFiles(r"N:\Sonstiges\geoserver\IM_Topo\GIS\MAPTILEIMAGES_0\tiles_2"):
    if f[-5].isalpha():
        os.rename(f,f[:-5]+f[-5].lower() + ".JPG")
        print "Renamed " +  "---to---" + f[:-5]+f[-5].lower() + ".JPG"

【问题讨论】:

  • 请尽量避免在帖子中添加无关的cmets和签名。
  • 您可能会遇到的一个问题是,在遍历树时重命名目录可能会导致遍历失败(因为您可能会尝试进入已重命名的目录)。所以你可能想要做的是列出所有需要重命名的目录,并在遍历之后有一个单独的循环来重命名这些目录。

标签: python rename directory


【解决方案1】:

问题是os.walk 的默认值是自上而下的。如果您尝试在自顶向下遍历时重命名目录,则结果是不可预测的。

尝试将os.walk 设置为自下而上:

for root, subFolders, files in os.walk(rootdir,topdown=False):

编辑

您遇到的另一个问题是listFiles() 正在返回文件而不是目录。

这个(未经测试的)子从下往上返回目录:

def listDirs(dir):
    for root, subFolders, files in os.walk(dir, topdown=False):
        for folder in subFolders:
           yield os.path.join(root,folder)
    return

【讨论】:

  • 感谢您的提示。我不知道如何更改代码以仅重命名目录而不是文件。我已经用 listDirs 替换了 listFiles 但这不起作用。干杯,罗伯
  • 使用subFolders 而不是filesfiles 是文件列表,subFolders 是子目录列表。
猜你喜欢
  • 2016-12-18
  • 2014-09-29
  • 2013-03-04
  • 2018-07-09
  • 2015-12-18
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多