如何在Python中更改文件夹名称?
我有很多文件夹,每个文件夹的名字都是一个人的名字,名字在前,姓在后。我想把这些文件夹的名字改成姓在前,后面跟一个逗号,然后是名字。
举个例子,在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")
区别:
- 如果源路径和目标路径在不同的文件系统或驱动器上,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)
37
os.rename("Joe Blow", "Blow, Joe")
对我来说似乎没问题。你在哪个部分遇到困难了呢?
51
你可以很简单地写出来,使用 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))