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

时间:2012-01-04 22:56:44

标签: python rename

我有多个文件夹,每个文件夹都有一个人的名字,首先是名字,最后是姓氏。我想更改文件夹名称,以便首先使用逗号,然后是第一个名称。

例如,在文件夹测试中,我有:

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来做到这一点,这样如果文件夹名称包含一个逗号,它将继续。

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

感谢您提供的任何帮助。

5 个答案:

答案 0 :(得分:30)

您可以使用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))

答案 1 :(得分:8)

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

似乎对我来说很好。你遇到了哪个部分?

答案 2 :(得分:4)

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)


答案 3 :(得分:3)

我喜欢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']

答案 4 :(得分:0)

您可以将它放在一个命令中,并带有完整路径。

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