使用 python 遍歷目錄下的文件

原文:http://www.cnblogs.com/pylemon/archive/2012/07/17/2594771.html

看到郵件列表裏面討論遍歷一個目錄下的文件 最 pythonic 的做法。有點繞 但是確實簡潔實用。效率也很高。收藏下。

 

分解下這神奇的一行代碼吧

sum([[os.path.join(base,file) for file in files] for base,,files in os.walk(dir)],[])

這一句是兩個嵌套的列表推倒,加上一個內置的sum函數得到了結果。sum在這裏的用法不同於平常我們對sum的使用比較特殊。
列表推倒還是比較容易理解的。
首先外層的列表推倒 遍歷出所有的 base 和 files, 這裏的base是所有的路徑,而files則是對應路徑下的所有文件。
寫成

In [16]: [(base, files) for base,,files in os.walk(dir)]
Out[16]:
[('/home/liwei/boxy',
['test.html',
'base.css',
'jquery-1.6.4.min.js',
'boxy.css',
'boxy.zip',
'jquery.boxy.js',
'clearboxy.css']),
('/home/liwei/boxy/images', ['icon
close.gif', 'poptbg.gif', 'btn.gif']),
('/home/liwei/boxy/bak', ['boxy
orig.css', 'screen.css'])]

可以看的很清楚了。路徑和對應的文件列表。
然後對第一步列表推到得到的結果。再進行一次列表推到,作用是合併得到的路徑和文件名,變成一個完整的路徑。
單獨拿一行出來。

('/home/liwei/boxy/bak', ['boxyorig.css', 'screen.css'])

這裏要做的就是,吧上面這一行,變成下面這樣的兩行。

'/home/liwei/boxy/bak/boxyorig.css',
'/home/liwei/boxy/bak/screen.css',

方法也很簡單,遍歷出來的結果直接join就可以了。使用的是 os.path.join 這個方法。這裏遍歷了 files 。
合併起來

In [17]: [[os.path.join(base,file) for file in files] for base,,files in os.walk(dir)]
Out[17]:
[['/home/liwei/boxy/test.html',
'/home/liwei/boxy/base.css',
'/home/liwei/boxy/jquery-1.6.4.min.js',
'/home/liwei/boxy/boxy.css',
'/home/liwei/boxy/boxy.zip',
'/home/liwei/boxy/jquery.boxy.js',
'/home/liwei/boxy/clear
boxy.css'],
['/home/liwei/boxy/images/iconclose.gif',
'/home/liwei/boxy/images/pop
tbg.gif',
'/home/liwei/boxy/images/btn.gif'],
['/home/liwei/boxy/bak/boxy_orig.css', '/home/liwei/boxy/bak/screen.css']]

這一步得到了一個列表中嵌套列表的結構。
接下來輪到神奇的sum了。平常我們會用sum來計算一個列表的和例如

sum([1, 2, 3, 4])
10

這裏的用法,簡化了 實際上就是做了這麼一件事情。

In [20]: sum([['a','b'],['c','d']],[])
Out[20]: ['a', 'b', 'c', 'd']

這裏將一個二維的列表,拉平了。
sum本質上是把傳給他的一個可迭代對象一個個的加起來,返回結果,我們知道列表也是可以相加的,得到的是一個新的列表,相當與是extend了原來的列表。sum可以接受第二個參數,它是一個可選參數,文檔中介紹到,這個參數的作用是指定sum的起始元素,你可以設置成一個數值,一個列表,上面這個例子中,設置了一個空列表,相當與上面的代碼執行了

[]+['a','b']+['c','d']

如果不給定起始的元素,那麼sum默認會用一個int去加,這樣就會報錯了。int是不能和list相加的。
這個方法可以用於拉平一個列表。速度快,實用!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章