【问题标题】:Python: Changing filenames and folder names in all folders and subfoldersPython:更改所有文件夹和子文件夹中的文件名和文件夹名
【发布时间】:2018-07-28 22:37:16
【问题描述】:

我想更改给定目录和所有子文件夹中的文件名和文件夹名。我的文件夹结构如下:

  • 顶层目录
    • 文件1
    • 文件2
    • 文件夹 1
      • 文件1
      • 文件2
      • 文件3
      • 文件4
    • 文件夹2
      • 文件1
      • 文件2
      • 文件3
      • 文件4

执行以下代码时出现以下错误。我已经检查了论坛,但找不到解决方案。有人可以帮我解决这个问题,让我知道我需要做什么才能让程序正常工作吗? 或者有没有更好的解决方案来重命名树中的文件和文件夹?

错误信息

FileNotFoundError: [WinError 2] 系统找不到指定的文件:'Filename 1' -> 'filename_1'

代码

#Change file names and folder names in a given directory and all its 
subfolders

import os

os.chdir("path\\to\\folder")
print(os.getcwd())

#Walk the directory and change the file names and folder names in all folders and subfolders.

for root, dirs, files in os.walk("path\\to\\folder"):
    for dir_name in dirs:
        os.rename(dir_name, dir_name.replace(" ", "_").lower())


    for file_name in files:
        os.rename(file_name, file_name.replace(" ", "_").lower())



#Print done once all files have been renamed.      
print("done")

【问题讨论】:

标签: python


【解决方案1】:

需要使用root否则重命名找不到路径:

for root, dirs, files in os.walk("path/to/folder"):
    for name in dirs + files:
        os.rename(os.path.join(root, name), os.path.join(root, name.replace(" ", "_").lower()))

【讨论】:

    【解决方案2】:

    会不会是您在重命名文件夹时走在文件夹上,以至于找不到它?

    看起来您首先需要重命名文件,然后才需要重命名目录(即使这样 - 确保它是自下而上的)

    【讨论】:

    • 我认为你是对的。但这并不是一个答案
    【解决方案3】:

    尝试先更改文件名,否则您将更改 dir_name 并失去参考。

    【讨论】:

    • 第一部分不是问题,因为 OP cd 到了正确的目录(好吧,这很丑)
    • 并为此使用os.path.join
    【解决方案4】:

    以下解决方案大部分时间都有效,但在规范化名称后仍可能存在同名文件等问题。

    import os
    
    os.chdir("path/to/dir")
    print(os.getcwd())
    
    #Walk the directory and change the file names and folder names in all folders and subfolders.
    
    for root, dirs, files in os.walk("path/to/dir", topdown=False):
       for file_name in files:
          new_name = file_name.replace(" ", "_").lower()
          if (new_name != file_name):
             os.rename(os.path.join(root, file_name), os.path.join(root, new_name))
    
       for dir_name in dirs:
          new_name = dir_name.replace(" ", "_").lower()
          if (new_name != dir_name):
             os.rename(os.path.join(root, dir_name), os.path.join(root, new_name))
    

    【讨论】:

      【解决方案5】:

      在这里,我将每个子文件夹内的所有文件复制到另一个路径。 首先使用os.listdir() 移动每个文件夹,然后使用它移动文件夹路径内的文件。最后使用os.rename() 重命名文件名。在这里,我将文件名更改为文件夹 name_file name,即“folder_file”:

      path = 'E:/Data1'
      path1 = 'E:/Data2'
      for folder in os.listdir(path):
          for file in os.listdir(path + '/'+ folder):
              src = path + '/' + folder + '/' + file
              des = path1 + '/' +  folder + '_' +file
              os.rename(src, des)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多