os.walk()ValueError:需要多于1个值才能解包

时间:2013-03-01 14:00:18

标签: python scripting os.walk

好吧,我正在使用Bioloid Premium人形机器人,Mac OS X无法识别它。所以我写了一个Python脚本来检测我的/ dev /文件夹中的更改,因为基于Linux的系统上的任何连接仍然通过文件描述符给出引用。我的代码应该工作,但是,当将三个变量分配给os.walk(顶部)返回的值时,我得到一个ValueError。有谁知道如何解决这个问题?我过去曾经使用过这个功能,并没有给我任何麻烦。我的剧本非常粗糙,我写了大约5分钟左右。

代码:

root_o, dir_o, files_o = os.walk(top)

,错误如下。

Traceback (most recent call last):
  File "detectdevs.py", line 15, in <module>
    findDevs()
  File "detectdevs.py", line 11, in findDevs
    root_o, dir_o, files_o = os.walk(top)
ValueError: need more than 1 value to unpack

我搜索了stackoverflow,我看到的所有ValueError问题都没有引用os.walk()函数。

4 个答案:

答案 0 :(得分:21)

os.walk返回一个迭代器,它产生三元组,而不是三元组:

for root, dirs, files in os.walk(top):
    # do stuff with root, dirs, and files

    In [7]: os.walk('.')
    Out[7]: <generator object walk at 0x1707050>

    In [8]: next(os.walk('.'))
    Out[8]:
    ('.',
     ['.vim',
      '.git',
       ...],
     ['.inputrc',
      ...])

答案 1 :(得分:7)

你需要迭代而不是os.walk()

for root_o, dir_o, files_o in os.walk(top):

或先存储迭代器,然后循环:

walker = os.walk(top)
for root_o, dir_o, files_o in walker:

callable的返回值是一个生成器函数,只有当你迭代它(使用for循环或通过调用迭代器上的next())它才会产生3值元组

答案 2 :(得分:2)

试试这个

for root_o, dir_o, files_o in os.walk(top)
    print root_o, dir_o, files_o

os.walk是一个生成器,你需要迭代它。

答案 3 :(得分:1)

也许在这里更有用的是“解压缩的价值超过1”。

在python中,您可以将元组(或列表,可能是)解压缩到相同数量的变量中:

a, b, c = (1, 2, 3)

出现了一些不同的错误:

>>> a, b, c = (1, 2, 3, 4, 5, 6)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack

>>> a, b, c = (1, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 2 values to unpack

具体来说,最后一个错误是您获得的错误类型。 os.walk()返回迭代器,即单个值。您需要强制将迭代器设置为 yield ,然后才能开始为您提供可以解压缩的值!

这是os.walk();它强制你循环它,因为它试图走路! 因此,以下代码段可能会对您有所帮助。

for root_o, dir_o, files_o in os.walk(top):
    make_magic_happen(root_o, dir_o, files_o)