【问题标题】:python script, recursive directorypython脚本,递归目录
【发布时间】:2016-06-21 01:09:03
【问题描述】:

我有以下代码,我需要使其递归(它不仅重命名该文件夹中的文件,还重命名该文件夹中的文件夹等...)

import glob
for file in glob.glob("/Users/shirin/Desktop/Artez/untitled.*"):
    print(file)

import glob
import os
from datetime import datetime

current_day = datetime.now().strftime("%Y-%m-%d")

for source_name in glob.glob("/Users/shirin/Desktop/Artez/untitled.*"):
    path, fullname = os.path.split(source_name)
    basename, ext = os.path.splitext(fullname)
    target_name = os.path.join(path, '{}{}'.format(current_day, ext))
    os.rename(source_name, target_name)

【问题讨论】:

  • 我打赌os.walk 会很有用。它默认递归。
  • 我需要如何在我的代码中实现它?

标签: python recursion directory


【解决方案1】:

您必须在其内部调用一个函数才能递归。 一种方法:

import os
from datetime import datetime

current_day = datetime.now().strftime("%Y-%m-%d")

def rename_files(path):
    os.chdir(path)
    for source_name in next(os.walk('.'))[2]:
        path, fullname = os.path.split(source_name)
        basename, ext = os.path.splitext(fullname)
        target_name = os.path.join(path, '{}{}'.format(current_day, ext))
        os.rename(source_name, target_name)
    for dir_name in next(os.walk('.'))[1]:
        rename_files(dir_name)
    os.chdir('..')


rename_files("/Users/shirin/Desktop/Artez")

【讨论】:

    【解决方案2】:

    试试这个:

    import os
    from datetime import datetime
    
    def walk_dir(path):
        current_day = datetime.now().strftime("%Y-%m-%d")
        for root, dirs, files in os.walk(path):    
            for filename in files:
                current = root + "/" + filename
                if os.path.isfile(current):
                    print "ORIGINAL NAME: " + current
                    ext = os.path.splitext(filename)[1]
                    target_name = os.path.join(root, '{}{}'.format(current_day, ext))
                    print "NEW NAME: " + target_name
                    os.rename(current, target_name)
    
    walk_dir("/Users/shirin/Desktop/Artez")
    

    我在包含子目录和文件的目录上运行walk_dir()。只有文件被重命名。输出:

    >>> walk_dir("dir1")
    ORIGINAL NAME: dir1/i_am_a_file_in_dir1.doc
    NEW NAME: dir1/2016-03-07.doc
    ORIGINAL NAME: dir1/dir2/file_in_dir2_saying_hi
    NEW NAME: dir1/dir2/2016-03-07
    ORIGINAL NAME: dir1/dir2/dir3/file_nested
    NEW NAME: dir1/dir2/dir3/2016-03-07
    ORIGINAL NAME: dir1/dir2/dir3/dir3file
    NEW NAME: dir1/dir2/dir3/2016-03-07
    ORIGINAL NAME: dir1/dir2/another_dir_at_level2/level2_dir2_file.extension
    NEW NAME: dir1/dir2/another_dir_at_level2/2016-03-07.extension
    

    【讨论】:

      【解决方案3】:

      我需要如何在我的代码中实现它?

      类似的东西:

      import glob
      import os
      from datetime import datetime
      
      current_day = datetime.now().strftime("%Y-%m-%d")
      
      for root, dirs, files in os.walk("/Users/shirin/Desktop/Artez"):
          for f in files:
              if not f.startswith("untitled."):
                  continue
              basename, ext = os.path.splitext(fullname)
              source_name = os.path.join(root, f)
              target_name = os.path.join(root, '{}{}'.format(current_day, ext))
              os.rename(source_name, target_name)
      

      【讨论】:

      • 它还没有工作,它只是重命名“Artez”中的文件
      • @malina 它应该在“Artez”的所有子目录中工作。还是您想处理桌面的所有子目录?
      • @malina 这不会递归,因为它需要调用本身的函数才能递归,而这不会这样做。它只处理文件,因此实际上并没有回答问题。