基本的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的位置会影响执行,因为&#34;。&#34;而变化。
raghu$ pwd
/Users/raghu/PycharmProjects/Fib
raghu$ python
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**
>>> ^D
raghu$ cd ..
raghu$ pwd
/Users/raghu/PycharmProjects
raghu$ python
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('.') # ------>**error**
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 3)
答案 0 :(得分:4)
当您打开包装时,您将耗尽右侧的可迭代物。您没有获得分配给dirpath, dirname, filenames
的{{1}}元组。
尝试将root, dirs, filenames
的第一个结果(即第一个产量)分配给os.walk(<value)
,然后将第二个结果(第二个产量)分配给root
然后最后,第三次屈服于dirs
。如果产生更多结果(或更少!),则会出现错误。如果只返回三个,它似乎有效。
所以,在第一种情况下,它只是运气而且file
结果被回馈给你,它被分配了(3
元组包含3
!)。
dirpath, dirname, filenames
通常不包含任何子目录,这就是你在那里得到不同错误的原因(只执行了3个三元组的生成)。
使用'/usr/bin'
,您还会获得更多返回的三个元素元组,因此您会收到相应的错误。
您可以通过检查生成器产生的项目数来瞥见这个:
'/'
正如您在上一个示例中所看到的,只产生了一个3元素元组。如果您找到>>> from os import walk
>>> len(list(walk('.')))
2300
>>> len(list(walk('/'))) # this is really dumb
127242
>>> len(list(walk('/usr/bin')))
1
的文件夹,则解包将起作用。
答案 1 :(得分:2)
由(读取:迭代时)os.walk(...)
生成的每个值都是一个3元组。你的代码就像函数返回一个单个这样的3元组,但它的真正含义是“期望这个目录树中正好有3个目录,并给(元组)信息提供(误导性)信息。每个”。
答案 2 :(得分:0)
来自文档:
对于以目录顶部为根的树中的每个目录(包括顶部 本身),它产生一个3元组(dirpath,dirnames,文件名)。
因此,在每种情况下,可能会有不同数量的元组正在产生,这会导致您的问题。