python scripting os.walk

python - os.walk() ValueError: necesita más de 1 valor para descomprimir



scripting (4)

Necesita iterar sobre os.walk() :

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

o almacene el iterador primero, luego bucle:

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

El valor de retorno del invocable es una función de generador, y solo cuando se itera sobre él (con un ciclo for o al llamar a next() en el iterador) produce las tuplas de 3 valores.

De acuerdo, estoy trabajando con un robot humanoide Bioloid Premium, y Mac OS X no lo reconocerá. Así que escribí un script de Python para detectar cambios en mi carpeta / dev / porque cualquier conexión en un sistema basado en Linux todavía recibe una referencia a través de un descriptor de archivo. Mi código debería funcionar, sin embargo, al asignar tres variables a los valores devueltos por os.walk (arriba), obtengo un ValueError. ¿Alguien sabe cómo puedo solucionar esto? He usado esta función en el pasado, y no me ha dado ningún problema. Mi secuencia de comandos por cierto es muy difícil, lo escribí en unos 5 minutos más o menos.

Código:

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

y el error es el siguiente.

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

Busqué alrededor de stackoverflow, y ninguno de los problemas de ValueError que vi hace referencia a la función os.walk ().


Prueba esto

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

os.walk es un generador y necesitas iterar sobre él.


Quizás lo que es más útil aquí es donde dice "más de 1 valor para desempaquetar".

En Python, "descomprimes" una tupla (o una lista, como puede ser) en el mismo número de variables:

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

Hay algunos errores diferentes que aparecen:

>>> 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

Específicamente, el último error es el tipo de error que está recibiendo. os.walk () devuelve un iterador , es decir, un valor único. ¡Necesitas forzar a ese iterador a ceder antes de que comience a darte valores que puedas desempaquetar!

Este es el punto de os.walk (); ¡te obliga a recorrerlo, ya que está intentando caminar! Como tal, el siguiente fragmento podría funcionar un poco mejor para usted.

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


os.walk devuelve un iterador que produce tres-tuplas, no una tres-tupla:

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