Как вернуть какой элемент из кортежа соответствовал в функции EndWith
Я пытаюсь сделать переименование файлов с помощью Python. Мне удалось успешно почистить Википедию для получения списка эпизодов, но при создании файла переименования меня встретили много расхождений. Я хочу, чтобы в конце вместо.mkv я хотел использовать именно то расширение, которое было найдено в условии if. Есть ли способ вернуть его?
extensions = ('.webm','.mkv','.flv','.vob','.ogv',
'.ogg','.drc','.gif','.gifv','.mng','.avi','.mov',
'.qt','.wmv','.yuv','.rm','.rmvb','.asf','.amv','.mp4',
'.m4p', '.m4v','.mpg', '.mp2', '.mpeg', '.mpe', '.mpv',
'.mpg', '.mpeg', '.m2v','.m4v','.svi','.3gp','.3g2','.mxf',
'.roq','.nsv','.f4v', '.f4p', '.f4a' ,'.f4b','.srt')
list = f.readlines()
y = 0
num = 1
for filename in os.listdir(path):
if filename.endswith(extensions):
os.rename(path+"\\"+filename,path+"\\"+str(num)+' - '+list[int(y)].strip('\n')+'.mkv') #instead of mkv, I want extension which was matched in the above if condition.
y += 1
num += 1
3 ответа
Ну, либо вам придется перебирать расширения по одному, либо вы можете разделить имя файла, чтобы получить расширение.
Разделить по имени файла
for filename in os.listdir(path):
if filename.endsswith(extensions):
extension = filename.split('.')[-1] # you can use os.path.splitext too as Max Chretien suggested
# ...
Использовать явный цикл
for filename in os.listdir(path):
matching_extensions = filter(lambda extension: filename.endswith(extension), extensions)
if matching_extensions:
extension = matching_extensions[0]
# ...
Еще один вывод, сначала я извлеку filename
а также file_extension
с помощью os.path.splitext
,
Тогда если file_extension
соответствует вашему extensions
кортеж я переименую его с try
except
чтобы увидеть, есть ли какие-либо ошибки.
for file_path in os.listdir(path):
filename, file_extension = os.path.splitext(file_path)
if file_extension in extensions:
try:
os.rename(file_path, filename + '.mkv')
except OSError:
print("Error while renaming {}".format(filename))
Если я правильно понимаю ваш вопрос, возможно, следующий код может работать.
extensions = ('.webm','.mkv','.flv','.vob','.ogv',
'.ogg','.drc','.gif','.gifv','.mng','.avi','.mov',
'.qt','.wmv','.yuv','.rm','.rmvb','.asf','.amv','.mp4',
'.m4p', '.m4v','.mpg', '.mp2', '.mpeg', '.mpe', '.mpv',
'.mpg', '.mpeg', '.m2v','.m4v','.svi','.3gp','.3g2','.mxf',
'.roq','.nsv','.f4v', '.f4p', '.f4a' ,'.f4b','.srt')
list = f.readlines()
y = 0
num = 1
for filename in os.listdir(path):
if ('.'+filename.lower().split('.')[1]) in list(extensions):
os.rename(path+"\\"+filename,path+"\\"+str(num)+' - '+list[int(y)].strip('\n')+'.mkv')
y += 1
num += 1
Я только что сделал одно небольшое изменение в вашем коде.
от: if filename.endswith(extensions):
чтобы: if ('.'+filename.lower().split('.')[1]) in list(extensions):
Надеюсь, поможет!