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

use*_*955 21 python rename

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

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

C:/Test/John Smith
C:/Test/Fred Jones
C:/Test/Ben Jack Martin
Run Code Online (Sandbox Code Playgroud)

我想这样做:

C:/Test/Smith, John
C:/Test/Jones, Fred
C:/Test/Martin, Ben Jack
Run Code Online (Sandbox Code Playgroud)

我尝试了os.rename的一些东西,但我似乎无法使用不同的名称长度,我不知道如何将逗号插入姓氏.

此外,一些文件夹名称已经是正确的形式,所以我需要在重命名期间跳过这些文件夹.我想你可以通过添加一个if来做到这一点,这样如果文件夹名称包含一个逗号,它将继续.

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

感谢您的任何帮助,您可以提供.

phi*_*hag 32

您可以使用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))
Run Code Online (Sandbox Code Playgroud)


jgr*_*tty 9

os.rename("Joe Blow", "Blow, Joe")
Run Code Online (Sandbox Code Playgroud)

似乎对我来说很好.哪个部分有问题?


ted*_*ted 7

一个替代方案os.renameshutil.move(src, dest)

import shutil
import os
shutil.move("M://source/folder", "M://destination/folder") 
os.rename("M://source/folder", "M://destination/folder")
Run Code Online (Sandbox Code Playgroud)

区别

  1. 如果源路径和目标路径位于不同的文件系统或驱动器上,操作系统模块可能无法移动文件。但在这种情况下,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)


Run Code Online (Sandbox Code Playgroud)


小智 7

您可以将其放入一个命令中,并包含完整路径。

import os
os.rename("/path/old_folder_name", "/path/new_folder_name")
Run Code Online (Sandbox Code Playgroud)