9

好的,我正在使用 Bioloid Premium 类人机器人,Mac OS X 无法识别它。因此,我编写了一个 Python 脚本来检测我的 /dev/ 文件夹中的更改,因为基于 Linux 的系统上的任何连接仍然通过文件描述符获得引用。我的代码应该可以工作,但是,当将三个变量分配给 os.walk(top) 返回的值时,我得到一个 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

4 回答 4

23

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',
      ...])
于 2013-03-01T14:03:39.197 回答
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:

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

于 2013-03-01T14:03:51.457 回答
3

试试这个

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

os.walk是一个生成器,您需要对其进行迭代。

于 2013-03-01T14:04:25.003 回答
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() 返回一个迭代器,即单个值。您需要强制该迭代器在它开始为您提供可以解包的值之前产生

这就是 os.walk(); 的意义所在。它迫使你绕过它,因为它试图走路!因此,以下代码段可能对您更有效。

for root_o, dir_o, files_o in os.walk(top):
    make_magic_happen(root_o, dir_o, files_o)
于 2013-03-01T14:13:44.047 回答