2013-06-05 97 views
0

我很努力並試圖理解Python。瞭解python中的變量賦值

對於os.walk文件說,它返回一個元組(dirpath,dirnames中,文件名)

的只是理解我試圖使用它像下面

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

目錄中有多個文件(看起來像錯誤消息中的兩個文件)。當你在一個循環中使用它時,你得到(xroot,dir,file)目錄中的每個文件。 –

回答

1

您的代碼嘗試將由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

os.walk返回一個迭代器。通常認爲做的是循環遍歷它

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

,但你也可以只使用xroot, dir, file = next(os.walk('C:\Python27\mycode'))單步通過

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'] 
>>> 
+0

生成器上的SO線程:http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained/231855#231855 – theodox