我是菜鸟并试图了解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:解包需要2个以上的值
我的问题是为什么我不能像上面那样分配它而不是它是循环的一部分(大多数示例使用它)?
答案 0 :(得分: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'])]
如您所见,结果是一个可迭代的(列表),其中每个元素都是一个三元组,然后可以将其解压缩到根文件夹,文件夹列表和文件列表中。
答案 1 :(得分:1)
os.walk返回一个迭代器。通常的想法是循环它
for xroot, dir, file in os.walk('C:\Python27\mycode'):
...
但您也可以使用xroot, dir, file = next(os.walk('C:\Python27\mycode'))
单步执行
答案 2 :(得分: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']
>>>