我希望程序将字幕文件重命名为与电影文件相同的字幕文件,它们位于不同的文件夹和子文件夹中。
我所做的:
导入了os
,re
和shutil
模块。
进行for
循环以遍历目录并返回父文件夹内的文件/文件夹。
for foldername, subfoldername, filename in os.walk('E:\Movies'):
此循环将遍历E:\Movies
文件夹并假定子文件夹和文件的列表。
要检查文件是否为字幕文件,请在for循环内
if filename.endswith('(.srt|.idx|.sub)'):
os.rename(filename,'')
答案 0 :(得分:0)
为什么要在第二个参数中给出多个路径和新名称?
您共享的代码执行以下操作:
Loop through the directory tree.
For each filename in directory :
If file is subtitle file :
Rename file to movie file present some directory
在最后一步中,您不会一次重命名所有文件。您一次要做一个。
os.rename(src,dest)
仅接受两个参数,src
文件名和dest
文件名。
因此,对于您的情况,您将不得不再次遍历目录中的所有文件,将字幕文件的名称与电影文件匹配,然后重命名字幕文件。
尝试类似的东西:
for foldername,subfoldername,filename in os.walk('E:\Movies'):
if filename.endswith('(.srt|.idx|.sub)'):
for folder2,subfolder2,moviename in os.walk('E:\Movies'):
# We don't want to match the file with itself
if(moviename != filename):
# You would have to think of your matching logic here
# How would you know if that subtitle is of that particular movie
# eg. if subtitle is of form 'a_good_movie.srt' you can split on '_' and check if all words are present in movie name
修改
在注释中进行了澄清之后,您似乎想要实现以下内容:
Loop through all Folders in Directory:
For each Folder in directory, rename all subtitle_files to the Folder name
您可以在Python 3中执行以下操作:
for folder in next(os.walk(directory))[1]:
for filename in next(os.walk(directory+folder))[2]:
if(filename.endswith(('.srt','.idx','.sub'))):
os.rename(filename,directory);
os.walk()
返回一个generator function。您可以像在python 3中那样访问os.walk()
生成器的值:
next(os.walk('C:\startdir'))[0] # returns 'C:\startdir'
next(os.walk('C:\startdir'))[1] # returns list of directories in 'C:\startdir'
next(os.walk('C:\startdir'))[2] # returns list of files in 'C:\startdir'
对于python 2,您可以调用具有相同返回值的os.walk().next()[]