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