基本的python问题。在
我正在玩os.walk
函数,并看到不一致的错误消息。
下面是o/p示例:
Python 3.6.2 (default, Jul 18 2017, 14:08:57)
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> root, dir, files = os.walk('.') # ------> **no error**
>>> root, dir, files = os.walk('/') # ------> **error #1**
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 3)
>>> root, dir, files = os.walk('/usr/bin') # ------>**error #2**
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 3, got 1)
>>>
我的理解是os.walk
返回生成器,所以错误2对我来说是有意义的。返回一个生成器值,但我将解压为3个值。在
所以:
os.walk('.')
时没有得到任何错误编辑1:
再多看一下,发现python运行的位置会影响执行,因为“.”的含义各不相同。在
^{pr2}$
从文件中:
因此,在每一种情况下,可能会产生不同数量的元组,这会导致您的问题。在
当你打开包装的时候,你把右边的iterable用完了。您没有得到分配给
root, dirs, filenames
的dirpath, dirname, filenames
元组。在尝试将
os.walk(<value)
的第一个结果(即第一个收益率)分配给root
,然后,将第二个结果(第二个收益率)分配给dirs
,最后,将第三个结果分配给file
。如果结果更多(或更少!)一旦屈服,你就会犯错误。如果只返回三个,它似乎可以工作。在所以,在第一种情况下,它只是运气使然,
3
结果被返回给您,并分配了(3
元组,其中包含dirpath, dirname, filenames
!)。在'/usr/bin'
通常不包含任何子目录,这就是为什么会出现不同的错误(只执行1个三元组的结果)。在使用
'/'
还可以获得更多数量的三个元素元组,因此可以得到适当的错误。在您可以通过检查生成器生成的项目数来了解这一点:
正如您在上一个示例中看到的,只生成了一个3元素元组。如果找到
len(list(walk('folder'))) == 3
的文件夹,则解包将正常工作。在(read:while iterating over)
os.walk(...)
产生的每个值都是一个3元组。您的代码就像函数返回一个单个这样的3元组,但它真正的意思是“在这个目录树中只需要3个目录,并为每个目录的(元组)信息提供(误导性)名称”。在相关问题 更多 >
编程相关推荐