如何在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中更改文件夹名称?的主要内容,如果未能解决你的问题,请参考以下文章