Как вернуть какой элемент из кортежа соответствовал в функции 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 кортеж я переименую его с tryexcept чтобы увидеть, есть ли какие-либо ошибки.

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):

Надеюсь, поможет!

Другие вопросы по тегам