使用 python 遍歷目錄下的文件


看到郵件列表里面討論遍歷一個目錄下的文件 最 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相加的。
這個方法可以用於拉平一個列表。速度快,實用!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM