9

わかりました。Bioloid Premium ヒューマノイド ロボットを使用していますが、Mac OS X では認識されません。そこで、/dev/ フォルダー内の変更を検出する Python スクリプトを作成しました。これは、Linux ベースのシステムでの接続にはファイル記述子を介した参照が引き続き与えられるためです。私のコードは機能するはずですが、os.walk(top) によって返される値に 3 つの変数を代入すると、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.walk3タプルではなく、3タプルを生成するイテレータを返します。

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 に答える