【问题标题】:I got this error ValueError: not enough values to unpack (expected 2, got 1)我收到此错误 ValueError: not enough values to unpack (expected 2, got 1)
【发布时间】:2021-01-06 14:05:40
【问题描述】:

Python

我正在尝试从 UCF-101 数据集中提取帧,但出现此错误: ValueError:没有足够的值来解包(预期 2,得到 1)。 我正在使用 Anaconda 1.7.2

这一行显示参数错误:sequence_type, sequence_name = video_path.split(".avi")[0].split("/")[-2:]

import av
import glob
import os
import time
import tqdm
import datetime
import argparse


def extract_frames(video_path):
    frames = []
    video = av.open(video_path)
    for frame in video.decode(0):
        yield frame.to_image()


prev_time = time.time()
if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--dataset_path", type=str, default="UCF-101", help="Path to UCF-101 dataset")
    opt = parser.parse_args()
    print(opt)

    time_left = 0
    video_paths = glob.glob(os.path.join(opt.dataset_path, "*", "*.avi"))
    for i, video_path in enumerate(video_paths):
        sequence_type, sequence_name = video_path.split(".avi")[0].split("/")[-2:]
        sequence_path = os.path.join(f"{opt.dataset_path}-frames", sequence_type, sequence_name)

        if os.path.exists(sequence_path):
            continue

        os.makedirs(sequence_path, exist_ok=True)

        # Extract frames
        for j, frame in enumerate(
            tqdm.tqdm(
                extract_frames(video_path, time_left),
                desc=f"[{i}/{len(video_paths)}] {sequence_name} : ETA {time_left}",
            )
        ):
            frame.save(os.path.join(sequence_path, f"{j}.jpg"))

        # Determine approximate time left
        videos_left = len(video_paths) - (i + 1)
        time_left = datetime.timedelta(seconds=videos_left * (time.time() - prev_time))
        prev_time = time.time()

【问题讨论】:

  • 在错误之前打印video_path,然后我们会看看出了什么问题。
  • 在尝试将其分配给 2 元组之前打印出 video_path.split(".avi")[0].split("/")[-2:],您将看到为什么会收到错误 Not enough values to unpack.
  • @JustinEzequiel 它显示包含在数据集文件夹中的所有路径
  • @BoarGules 显示没有.avi扩展名的视频路径
  • 这部分.split("/")[-2:]最多返回两个字符串;注意“最多”。由于您没有显示video_path 在错误点的值是多少,我只能指出[-2:] 切片为您提供了一个仅包含一个字符串而不是您期望的两个字符串的列表。也许video_path 不包含正斜杠。

标签: python dataset frames


【解决方案1】:

您对 cme​​ts 中的建议和问题的回答向我表明,此代码并不是您真正的代码,您不清楚这一行是什么

sequence_type, sequence_name = video_path.split(".avi")[0].split("/")[-2:]

应该这样做。所以让我解释一下。它需要video_path,它是.avi 文件的完整路径,例如'~/folder/subfolder/subsubfolder/myfile.avi'。它从扩展 .avi 中分离出来,从剩下的部分,即 '~/folder/subfolder/subsubfolder/myfile' 中取出 最后两个元素,即 subsubfoldermyfile,并将它们用作值对于sequence_typesequence_name

但要使其正常工作,video_path 必须同时包含 subsubfoldermyfile,并在两者之间使用斜线,因此至少要包含 'subsubfolder/myfile.avi'

glob.glob() 返回的路径名之一甚至不包含一个 / 字符。这就是为什么 split("/") 返回一个 1 列表,它不足以解压到 2 元组 (sequence_type, sequence_name),导致错误 Not enough values to unpack

我认为可能发生这种情况的唯一原因是您在 Windows 上工作,其中路径分隔符是 \ 而不是 /。这意味着您的代码从glob.glob() 返回的路径名类似于'C:\Users\folder\subfolder\subsubfolder\myfile.avi'。没有斜线:不可能,因为 Windows 文件名不能包含斜线。

这就是为什么评论者要求您向我们展示您试图解开的价值,而不是仅仅告诉我们。编程问题通常与微小的具体细节有关。所以,在你没有明确回应的情况下,这仍然只是一个猜测,但如果猜测是正确的,那么给出错误的那一行应该是

sequence_type, sequence_name = video_path.split(".avi")[0].split("\\")[-2:]

(注意,您必须将反斜杠加倍)或者,如果您希望代码独立于平台,

sequence_type, sequence_name = video_path.split(".avi")[0].split(os.path.sep)[-2:]

【讨论】:

  • +1 用于解释清楚且独立于平台的解决方案。我一定会牢记这一点,以备将来实施
猜你喜欢
  • 1970-01-01
  • 2020-10-10
  • 2022-01-08
  • 2017-12-23
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 2020-10-26
  • 2022-07-22
相关资源
最近更新 更多