如何在python中更改文件夹名称?

Posted

技术标签:

【中文标题】如何在python中更改文件夹名称?【英文标题】:How to change folder names in 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 来做到这一点,这样如果文件夹名称包含逗号,它将继续。

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

感谢您提供的任何帮助。

【问题讨论】:

【参考方案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:

    如果源路径和目标路径位于不同的文件系统或驱动器上,OS 模块可能无法移动文件。 但是 shutil.move 在这种情况下不会失败。

    shutil.move 检查源路径和目标路径是否在同一个文件系统上。但是 os.rename 不检查,因此有时会失败。

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

    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")

【讨论】:

以上是关于如何在python中更改文件夹名称?的主要内容,如果未能解决你的问题,请参考以下文章

用Python查找某文件夹的文件名称,并对文件名进行更改的库名称是啥?

python MIME:如何更改附件的名称?

Python文件路径和名称检索

在 Python 中更改文件权限

动态更改的 Python 打开文件路径

如何在github中更改文件夹名称