2013-03-01 74 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();它勢力你循環它,因爲它試圖走路! 因此,下面的代碼片段可能會爲您更好一些。

​​
相關問題