2013-03-01 75 views
6

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

代码:

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 

我没有搜索周围的计算器,也没有看到ValueError问题引用了os.walk()函数。

+0

我不确定MacOSX,但在Linux上,您可以使用[udev](http://en.wikipedia.org/wiki/Udev)检测设备插入时间。 – unutbu 2013-03-01 14:06:11

+0

udev的MacOSX等价物似乎是[diskutil活动](http://apple.stackexchange.com/questions/46951/is-there-a-mac-equivalent-for-udev-folder-on-linux)。 – unutbu 2013-03-01 14:36:29

回答

17

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', 
     ...]) 
+0

+1从问题到答案3分钟 - 令人印象深刻! :-) – 2013-03-01 14:05:19

7

您需要迭代os.walk()

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

o r第一存储迭代器,然后循环:

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

可调用的返回值是发电机的功能,只有当你迭代它(用for环或通过在迭代器调用next())做它的产量三值元组。

2

试试这个

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

os.walk是一台发电机,你需要遍历它。

1

也许这里更有用的是它说“超过1个解包值”。

看到,蟒蛇,你“解压”一元组(或列表,因为它可能是)到相同数量的变量:

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();它势力你循环它,因为它试图走路! 因此,下面的代码片段可能会为您更好一些。

​​
相关问题