1

我是菜鸟,并试图理解 Python。

对于 os.walk 文档说它返回一个元组 (dirpath, dirnames, filenames)

只是为了理解我正在尝试像下面这样使用它

import os
from os.path import join, getsize
file=[]
dir=[]
xroot,dir,file = os.walk('C:\Python27\mycode')

但它给了我这样的错误: xroot,dir,file = os.walk('C:\Python27\mycode') ValueError: need more than 2 values to unpack

我的问题是为什么我不能像上面那样分配它而不是让它成为循环的一部分(大多数例子都使用它)?

4

3 回答 3

2

您的代码尝试将返回的生成器解压缩os.walk()为三元组。这很好,但问题是生成器只产生两个项目,这是行不通的。

生成器中的每个项目本身都是一个三元组,这就是您的for循环真正解包每次迭代的内容。更详细的写法是:

for three_tuple in os.walk('C:\Python27\mycode'):
    xroot, dir, file = three_tuple

您可能会发现将生成器实际转换为列表更容易:

>>> pprint.pprint(list(os.walk('.')))
[('.', ['foo'], ['main.py']),
 ('.\\foo', [], ['test.py', 'test.pyc', '__init__.py', '__init__.pyc'])]

如您所见,结果是一个可迭代的(列表),其中每个元素都是一个三元组,然后可以将其解压缩到根文件夹、文件夹列表和文件列表中。

于 2013-06-05T05:57:00.833 回答
1

os.walk 返回一个迭代器。通常的想法是循环它

for xroot, dir, file in os.walk('C:\Python27\mycode'):
    ...

但您也可以只使用xroot, dir, file = next(os.walk('C:\Python27\mycode'))单步执行

于 2013-06-05T05:57:12.757 回答
1

os.walk不返回root,dir,file。它返回一个生成器对象供程序员循环使用。很可能是因为给定的路径可能有子目录、文件等。

>>> import os
>>> xroot,dir,file = os.walk('/tmp/') #this is wrong.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
>>> os.walk('/tmp/')
<generator object walk at 0x109e5c820> #generator object returned, use it
>>> for xroot, dir, file in os.walk('/tmp/'):
...     print xroot, dir, file
... 
/tmp/ ['launched-IqEK']
/tmp/launch-IqbUEK [] ['foo']
/tmp/launch-ldsaxE [] ['bar']
>>> 
于 2013-06-05T05:58:23.150 回答