Как разрешить IndexError: список индекса вне диапазона? - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь скопировать этот репозиторий: https://github.com/sujiongming/UCF-101_video_classification. Я получаю следующую ошибку при запуске файла 2_extract_files.py.

Traceback (most recent call last):
  File "2_extract_files.py", line 99, in <module>
    main()
  File "2_extract_files.py", line 96, in main
    extract_files()
  File "2_extract_files.py", line 38, in extract_files
    video_parts = get_video_parts(video_path)
  File "2_extract_files.py", line 76, in get_video_parts
    filename = parts[3]
IndexError: list index out of range

Код выглядит следующим образом:

def extract_files():
    data_file = []
    folders = ['./train/', './test/']

    for folder in folders:
        class_folders = glob.glob(folder + '*')

        for vid_class in class_folders:
            class_files = glob.glob(vid_class + '/*.avi')

            for video_path in class_files:
                video_parts = get_video_parts(video_path)

                train_or_test, classname, filename_no_ext, filename = video_parts
                if not check_already_extracted(video_parts):

                    src = train_or_test + '/' + classname + '/' + \
                        filename
                    dest = train_or_test + '/' + classname + '/' + \
                        filename_no_ext + '-%04d.jpg'
                    call(["ffmpeg", "-i", src, dest])

                nb_frames = get_nb_frames_for_video(video_parts)

                data_file.append([train_or_test, classname, filename_no_ext, nb_frames])

                print("Generated %d frames for %s" % (nb_frames, filename_no_ext))

    with open('data_file.csv', 'w') as fout:
        writer = csv.writer(fout)
        writer.writerows(data_file)

    print("Extracted and wrote %d video files." % (len(data_file)))

def get_nb_frames_for_video(video_parts):
    train_or_test, classname, filename_no_ext, _ = video_parts
    generated_files = glob.glob(train_or_test + '/' + classname + '/' +
                                filename_no_ext + '*.jpg')
    return len(generated_files)

def get_video_parts(video_path):
    parts = video_path.split('/')
    filename = parts[3]
    filename_no_ext = filename.split('.')[0]
    classname = parts[2]
    train_or_test = parts[1]

    return train_or_test, classname, filename_no_ext, filename

Может кто-нибудь сказать мне, что я делаю не так, и руководство мне о том, как правильно получить индекс списка. Заранее спасибо.

Window 10
Python 3.7.6

1 Ответ

1 голос
/ 17 февраля 2020

Рекомендуется использовать только os.path.split(video_path) и os.path.splitext() и проходить через него, это безопаснее и более портативно:

def get_video_parts(video_path):
    head, filename = os.path.split(video_path)
    filename_no_ext, ext = os.path.splitext(filename)
    head, classname = os.path.split(head)
    head, train_or_test = os.path.split(head)

    return train_or_test, classname, filename_no_ext, filename

https://docs.python.org/3/library/os.path.html#os .path.split

Я немного устарел - так что есть вероятность, что вы хотели бы попробовать pathlib для более высокоуровневых операций над объектами путей - в этом случае, вероятно, будет комбинация path.stem(), чтобы получить название последней части без расширения и от path.parent() до go вверх.

https://docs.python.org/3/library/pathlib.html#module -pathlib

...