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