我有多个文件夹,每个文件夹都有一个人的名字,首先是名字,最后是姓氏。我想更改文件夹名称,以便首先使用逗号,然后是第一个名称。
例如,在文件夹测试中,我有:
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来做到这一点,这样如果文件夹名称包含一个逗号,它将继续。
否则,姓氏将始终是文件夹名称中的最后一个单词。
感谢您提供的任何帮助。
答案 0 :(得分:30)
您可以使用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))
答案 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")
如果源路径和目标路径位于不同的文件系统或驱动器上,则
- 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)
答案 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")