Python 值解包错误

0 投票
2 回答
4217 浏览
提问于 2025-04-15 12:58

我正在用Django搭建一个每个用户都能浏览和上传文件的应用程序。当我运行这个函数时:


def walkdeep(request, path):
    path, dirs, files = walktoo('/home/damon/walktemp/%s' % path)
    return render_to_response('walk.html', {
        'path' : path[0],
        'dirs' : path[1],
        'files' : path[2],
    }, context_instance=RequestContext(request))

def walktoo(dir):
    for path, dirs, files in os.walk(dir):
        yield path, dirs, files
    print path, dirs, files

我遇到了这个错误:

需要超过1个值来解包

另外,我知道这样做很傻,任何建议都很欢迎。

编辑:

其实我真的是太傻了,我完全忘记了os.listdir(dir)这个函数,它对我来说要合理得多。如果你使用选中的答案,它解决了我之前遇到的问题,但结果却不是我想要的。

2 个回答

1

根据你对 Adam Rosenfield 的评论,这里有另一种方法可以获取一个层级的 os.walk(dir)。

path, dirs, files = [_ for _ in os.walk('/home/damon/walktemp/%s' % path)][0]

这是一种替代你 walktoo(dir) 函数的方法。

另外,确保你传给 render_to_response 的第二个参数使用了你创建的变量:

{'path' : path,
 'dirs' : dirs,
 'files' : files,}

path 是一个字符串,所以当你说 path[0] ... path[1] ... path[2] 时,其实是在说使用这个字符串的第一个、第二个和第三个字符。

7
path, dirs, files = walktoo('/home/damon/walktemp/%s' % path)

在这一行代码中,你希望 walktoo 返回一个包含三个值的元组,然后把这三个值分别放到 pathdirsfiles 里。不过,你的 walktoo 函数其实是一个生成器对象:调用 walktoo() 只会得到一个生成器,而不是你想要的三个值。你需要对这个生成器使用 next(),或者通过某种方式进行迭代,才能得到你真正想要的三个值的元组。

我不太明白你想要做什么——你的 walkdeep() 函数看起来只想使用 walktoo() 返回的第一个值。你是不是想做这样的事情呢?

for path, dirs, files in walktoo(...):
    # do something

撰写回答