【问题标题】:How to change folder names in python?如何在python中更改文件夹名称?
【发布时间】:2012-02-02 20:28:19
【问题描述】:

我有多个文件夹,每个文件夹都有一个人的名字,名字在前,姓氏在后。我想更改文件夹名称,以便姓氏先跟一个逗号,然后是名字。

例如,在文件夹 Test 中,我有:

C:/Test/John Smith
C:/Test/Fred Jones
C:/Test/Ben Jack Martin

我想做这个:

C:/Test/Smith, John
C:/Test/Jones, Fred
C:/Test/Martin, Ben Jack

我尝试使用 os.rename 进行一些操作,但似乎无法使其适用于不同的名称长度,而且我不确定如何将逗号插入姓氏。

另外,一些文件夹名称已经是正确的格式,所以我需要在重命名过程中跳过这些文件夹。我认为您可以通过添加一个 if 来做到这一点,这样如果文件夹名称包含逗号,它将继续。

否则,姓氏将始终是文件夹名称中的最后一个单词。

感谢您提供的任何帮助。

【问题讨论】:

    标签: python rename


    【解决方案1】:

    您可以使用os.listdir 和os.path 函数相当直接地写出来:

    import os
    basedir = 'C:/Test'
    for fn in os.listdir(basedir):
      if not os.path.isdir(os.path.join(basedir, fn)):
        continue # Not a directory
      if ',' in fn:
        continue # Already in the correct form
      if ' ' not in fn:
        continue # Invalid format
      firstname,_,surname = fn.rpartition(' ')
      os.rename(os.path.join(basedir, fn),
                os.path.join(basedir, surname + ', ' + firstname))
    

    【讨论】:

    • 当我尝试这个时,我被告知“系统找不到指定的路径:'C:/Test/*.*'”。不知道这意味着什么。
    • @user1130955 这意味着您的系统上不存在C:/Test。你确定那是你的用户名目录所在的目录吗?
    • 这意味着 c:\Test 完全不存在。
    • 对不起,不再是问题了,我的目录有误。修复了它,它工作得很好。谢谢。
    • 我一直在使用其他文件夹的代码,但某些文件夹出现此错误:[错误 183] 当文件已存在时无法创建文件。这只是因为某些文件夹已经包含正确的名称和未更正的名称。我只想合并这些文件夹。如果我只是在代码中添加另一个 if 会起作用吗,这样如果文件夹已经存在,那么合并它们的内容?
    【解决方案2】:
    os.rename("Joe Blow", "Blow, Joe")
    

    对我来说似乎工作得很好。你在哪个部分有问题?

    【讨论】:

    • 当我为每个文件夹单独执行此操作时,这很好,但我似乎无法让它循环遍历所有文件夹。问题是我不知道如何为所有文件夹指定名字和姓氏。
    • phihag 上面的例子可能会完美运行。他使用 rnpartition 来分割字符串。我可能会使用 split(),但他的示例应该可以工作。
    • 只能用于非空文件夹
    • 这不是真的......无论文件夹是否为空,这都有效。
    【解决方案3】:

    os.rename 的替代品是shutil.move(src, dest)

    import shutil
    import os
    shutil.move("M://source/folder", "M://destination/folder") 
    os.rename("M://source/folder", "M://destination/folder")
    

    Differences:

    1. 如果源路径和目标路径位于不同的文件系统或驱动器上,OS 模块可能无法移动文件。 但是 shutil.move 在这种情况下不会失败。
    2. shutil.move 检查源路径和目标路径是否在同一个文件系统上。但是 os.rename 不检查,因此有时会失败。

    3. 检查源路径和目标路径后,如果发现不在同一个文件系统中,shutil.move会先将文件复制到目标。然后它将从源文件中删除该文件。因此,当源路径和目标路径不在同一个驱动器或文件系统上时,我们可以说 shutil.move 是一种在 Python 中移动文件的更智能的方法。

    4. shutil.move 适用于高级函数,而 os.rename 适用于低级函数。

    我还建议使用pathlib 来操纵路径:

    from shutil import move
    from pathlib import Path
    
    
    base_path = Path("C:/Test")
    
    for folder in base_path.iterdir():
        if not folder.is_dir() or folder.name.startswith("."):
            continue
    
        name = folder.name
        new_name = ", ".join(name.split(" "))
        new_folder = folder.parent / new_name
    
        move(folder, new_folder)
    
    
    

    【讨论】:

      【解决方案4】:

      我喜欢 phihag 对rpartition() 的建议,我认为以下内容大致相同:

      >>> 'first second third fourth'.rpartition(' ')
      ('first second third', ' ', 'fourth')
      >>> 'first second third fourth'.rsplit(None, 1)
      ['first second third', 'fourth']
      

      我更喜欢rsplit(),因为我不想关心分隔符,但我也可以看到它有点冗长。

      设置

      >>> base = 'C:\\Test'
      >>> os.makedirs(os.path.join(base, 'John Smith'))
      >>> os.makedirs(os.path.join(base, 'Fred Jones'))
      >>> os.makedirs(os.path.join(base, 'Ben Jack Martin'))
      >>> os.listdir(base)
      ['Ben Jack Martin', 'Fred Jones', 'John Smith']
      

      解决方案

      >>> for old_name in os.listdir(base):
          # [::-1] is slice notation for "reverse"
          new_name = ', '.join(old_name.rsplit(None, 1)[::-1])
          os.rename(os.path.join(base, old_name),
                os.path.join(base, new_name))
      
      
      >>> os.listdir(base)
      ['Jones, Fred', 'Martin, Ben Jack', 'Smith, John']
      

      【讨论】:

        【解决方案5】:

        你可以把它放在一个命令中,包含完整的路径。

        import os
        os.rename("/path/old_folder_name", "/path/new_folder_name")
        

        【讨论】:

          猜你喜欢
          • 2019-04-27
          • 1970-01-01
          • 2023-03-18
          • 2020-06-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多