如何使用现有名称的一部分在Python中重命名多个文件?

如何使用现有名称的一部分在Python中重命名多个文件?,python,file-rename,shutil,python-os,Python,File Rename,Shutil,Python Os,我在一个目录中有几百个.mp4文件。最初创建时,它们的名称被设置为“ExampleEventName-第1天”、“ExampleEventName-第2天”等。因此它们不按时间顺序排列 我需要一个脚本来修改它们的名字,方法是在相应的字符串中取最后5个字符,并将其添加到名字的前面,这样文件资源管理器就能正确地排列它们 我尝试在for循环中使用os模块.listdir()和.rename()函数。根据我的输入,我会得到FileNotFoundError或TypeError:List对象不可调用

我在一个目录中有几百个.mp4文件。最初创建时,它们的名称被设置为“ExampleEventName-第1天”、“ExampleEventName-第2天”等。因此它们不按时间顺序排列

我需要一个脚本来修改它们的名字,方法是在相应的字符串中取最后5个字符,并将其添加到名字的前面,这样文件资源管理器就能正确地排列它们

我尝试在for循环中使用os模块.listdir()和.rename()函数。根据我的输入,我会得到FileNotFoundError或TypeError:List对象不可调用


    import os
    os.chdir("E:\\New folder(3)\\New folder\\New folder")


    for i in os.listdir("E:\\New folder(3)\\New folder\\New folder"):
        os.rename(i, i[:5] +i)

回溯(最近一次呼叫最后一次):
文件“C:/Python Projects/Alex_I/venv/Alex_OS.py”,第14行,在
对于文件列表中的文件名(“E:\\New folder(3)\\New folder\\New folder”):
TypeError:“列表”对象不可调用

您遇到了多个问题: 您试图增加一个不应该增加的值。您还创建了列表文件\u list,因此它不应该再接受任何参数

使用语法时:

for x in y: 
您不必增加该值。它只需在列表中迭代,直到没有剩余的列表

因此,您只需省去增量,并遍历列表文件\u list

import os, shutil

file_list = os.listdir("E:\\New folder(3)\\New folder\\New folder")

for file_name in file_list: #removed the argument, the as file_list is a list and thus not callable.
    dst = "!@" + " " + str(file_name) #!@ meant as an experiment
    src = "E:\\New folder(3)\\New folder\\New folder" + file_name
    dst = "E:\\New folder(3)\\New folder\\New folder" + file_name

    os.rename(src, dst)
    #file_name +=1 removed this line
现在您的解决方案应该可以工作了。

其他一些方法: 不基于基本长度(子名称为5)


首先,检查您是否有正确的路径:os.path.isdir(path)True,这在那里是无用的,但是列表对象不可调用错误仍然存在。请查看我的编辑。您正在调用file_list(something),而不是简单地在for循环中遍历file_list。回溯(最后一次调用):OS.rename(src,dst)FileNotFoundError:[WinError 2]系统找不到指定的文件:太好了!所以现在我们解决了你的问题,正如你在问题中所说的,你应该把我的答案标记为答案。然而,让我们继续工作,直到你成为黄金。它表示没有保存在字符串src中的名称的文件名。src到底持有什么?它是否符合您的预期?尝试打印src的值。
Traceback (most recent call last):
  File "C:/Python Projects/Alex_I/venv/Alex_OS.py", line 14, in <module>
    for file_name in file_list("E:\\New folder(3)\\New folder\\New folder"):
TypeError: 'list' object is not callable
for x in y: 
import os, shutil

file_list = os.listdir("E:\\New folder(3)\\New folder\\New folder")

for file_name in file_list: #removed the argument, the as file_list is a list and thus not callable.
    dst = "!@" + " " + str(file_name) #!@ meant as an experiment
    src = "E:\\New folder(3)\\New folder\\New folder" + file_name
    dst = "E:\\New folder(3)\\New folder\\New folder" + file_name

    os.rename(src, dst)
    #file_name +=1 removed this line
import glob
import os

# For testing i created 99 files -> asume last 5 chars but this is wrong if you have more files
# for i in range(1, 99):
#     with open("mymusic/ExampleEventName - Day {}.mp4".format(i), "w+") as f:
#         f.flush()

# acording to this i will split the name at - "- Day X"

files = sorted(glob.glob("mymusic/*"))

for mp4 in files:
    # split path from file and return head ( path ), tail ( filename )
    head, tail = os.path.split(mp4)
    basename, ext = os.path.splitext(tail)
    print(head, tail, basename)
    num = [int(s) for s in basename.split() if s.isdigit()][0] #get the number extracted
    newfile = "{}\\{}{}{}".format(head, num, basename.rsplit("-")[0][:-1], ext) # remove - day x and build filename 
    print(newfile) 
    os.rename(mp4, newfile)