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

53 投票
6 回答
112088 浏览
提问于 2025-04-17 09:34

我有很多文件夹,每个文件夹的名字都是一个人的名字,名字在前,姓在后。我想把这些文件夹的名字改成姓在前,后面跟一个逗号,然后是名字。

举个例子,在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语句,这样如果文件夹的名字里有逗号,就可以继续处理。

否则,姓总是文件夹名字的最后一个词。

谢谢你能提供的任何帮助。

6 个回答

15

一个替代 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")

区别:

  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)


37
os.rename("Joe Blow", "Blow, Joe")

对我来说似乎没问题。你在哪个部分遇到困难了呢?

51

你可以很简单地写出来,使用 os.listdiros.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))

撰写回答