【问题标题】:Recursively rename files and folders递归重命名文件和文件夹
【发布时间】:2014-08-11 00:57:19
【问题描述】:

上下文

目前我正在研究大型数字档案。根据法律,这些档案应保存 20 至 70 年左右。我的研究是关于如何使用企业搜索解决方案检索这些档案中的文档。在我可以对这些档案做任何事情之前,应该将它们复制到本地存储中。大多数档案都通过 USB 驱动器和记忆棒发送给我。档案大小在 4GB 到 250GB 之间。与此同时,我正在学习编写 python 来编写搜索解决方案的脚本。

问题

由于深度嵌套的目录和文件,复制文件和目录是有问题的。很多文件或目录的名称都很长(有时超过 255 个字符,Windows 仍然会卡住)。

解决方案

编写一个 Python 脚本,该脚本递归地删除文件夹和文件名中的所有空格,以将这些空格缩短到 255 个字符以下。同样为了保留旧名称,新名称将采用驼峰式命名。

问题

我编写了一个脚本来删除空格和 camelCase 文件和文件夹名称。但它仅适用于所选目录;它不是递归的。我尝试了os.walk 函数,但我似乎无法用os.walk 实际更改名称。使用os.listdir 我可以更改名称,但我不明白如何递归地进行操作。那么如何使用 Python 递归地重命名文件和文件夹呢?

代码

import os

current_path  = os.getcwd() # testing only
print current_path
path = "k:/test3/"
os.chdir(path)
current_path  = os.getcwd()
print current_path # testing only
new_filename= ""
#filenames = os.walk(path, topdown=False)

# all print statusses should be rewritten to lines in log files.

filenames =os.listdir(path)
print filenames
for filename in filenames:
    print "\nOldname: \n" +filename
    new_filename = filename.lower().strip() 
    #make sure all filenames are in lowercase and cut whitespace on both ends.
    if " " in filename: #test for spaces in file or foldername
        fn_parts= [w.capitalize() for w in filename.split()]
        print "The parts are: "
        print  fn_parts
        new_filename="" #empty new_filename after last iteration
        new_filename=new_filename.join(fn_parts)
        print "New filename: \n"+new_filename + "\n"
        os.rename(os.path.join(path, filename), os.path.join(path, new_filename))
    else:
        new_filename=new_filename.title()
        print "New filename: \n"+new_filename + "\n"
        os.rename(os.path.join(path, filename), os.path.join(path, new_filename))

【问题讨论】:

  • @jonrsharpe 感谢您编辑我的问题,英语不是我的母语。因此,感谢您帮助澄清问题。

标签: python windows recursion filenames directory


【解决方案1】:

不确定但是使用 os.walk 更改代码可能会帮助您希望如此。

import os
current_path  = os.getcwd() # testing only
print current_path
path = "k:/test3/"
os.chdir(path)
current_path  = os.getcwd()
print current_path # testing only
new_filename= ""
#filenames = os.walk(path, topdown=False)

# all print statusses should be rewritten to lines in log files.

filenames =os.listdir(path)
print filenames
for dir,subdir,listfilename in os.walk(path):

    for filename in listfilename:
        print "\nOldname: \n" +filename 
        new_filename = filename.lower().strip() 
        #make sure all filenames are in lowercase and cut whitespace on both ends.
        if " " in filename: #test for spaces in file or foldername
            fn_parts= [w.capitalize() for w in filename.split()]
            print "The parts are: "
            print  fn_parts
            new_filename="" #empty new_filename after last iteration
            new_filename=new_filename.join(fn_parts)
            print "New filename: \n"+new_filename + "\n"
            os.rename(os.path.join(dir, filename), os.path.join(path, new_filename))
        else:
            new_filename=new_filename.title()
            print "New filename: \n"+new_filename + "\n"
            os.rename(os.path.join(path, filename), os.path.join(path, new_filename))

【讨论】:

  • 如果需要更多帮助,请告诉我。
  • 也许您应该在回答中更清楚地说明这一点。
  • 我尝试了这个解决方案,但它会生成以下错误“WindowsError 128 无法创建已存在的文件”。所以看来是用旧名还是重用新名。
【解决方案2】:

我使用 python 的经验是在 linux 上,但也许你可以遍历该驱动器的全局

https://docs.python.org/2/library/glob.html

并使用 shutil 将文件移动或复制到新位置?

https://docs.python.org/2/library/shutil.html?

两者的使用都非常简单,但如果您在使用它们时遇到特定问题,也有大量关于这两个库的堆栈溢出问题的答案。

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-18
    • 2014-07-12
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    相关资源
    最近更新 更多