Python 如何查找特定類型文件
寫在之前
今天的文章是介紹如何用 Python 去定位特定類型的文件,會講到用字符串匹配文件名定位特定文件以及順帶介紹一下遍歷目錄樹的函數(shù),通過今天的這一部分以及之前文章講到的文件獲取屬性的操作,可以做很多有意思的事情。
定位特定文件
定位特定的文件,可以使用 fnmatch 以及 glob 這兩個標(biāo)準(zhǔn)庫,我們下面來分別看一下。
1. 使用 fnmatch 標(biāo)準(zhǔn)庫
一般的話我們想要查找特定類型的文件,可以通過字符串的前綴匹配和后綴匹配來查找,具體實(shí)例如下所示:
>>> import os >>> [txt for txt in os.listdir('.') if txt.endswith('.txt')] ['b.txt', 'a.txt']
其實(shí)大部分的情況下這種用字符串匹配的方法來查找文件就足夠可以滿足需要,如果有些情況下需要更加靈活一點(diǎn)的字符串匹配,就可以使用 fnmatch 庫,這是一個專門用來進(jìn)行文件名匹配的庫,支持使用通配符來進(jìn)行文字匹配(比如'*','?'等)。
fnmatch 這個庫很簡單,只有 4 個函數(shù):fnmatch,fnmatchcase,filter,translate:
- fnmatch:判斷文件名是否符合特定的模式;
- fnmatchcase:判斷文件名是否符合特定的模式(不區(qū)分大小寫);
- filter:返回輸入列表中,符合特定模式的文件名列表;
- translate:將通配符模式轉(zhuǎn)換成正則表達(dá)式。
上面 4 個最常用是它的同名函數(shù) fnmatch ,我的當(dāng)前目錄下有 4 個文件,分別是:a.txt,b.txt,c.py,test.py,下面我就用 fnmatch 函數(shù)來對當(dāng)前目錄下的這 4 個文件進(jìn)行匹配性測試,具體請看下面代碼:
>>> import os >>> import fnmatch >>> os.listdir('.') ['test.py', 'c.py', 'b.txt', 'a.txt'] >>> [txt for txt in os.listdir('.') if fnmatch.fnmatch(txt, '*.txt')] ['b.txt', 'a.txt'] >>> [file for file in os.listdir('.') if fnmatch.fnmatch(file, '[a-c]*')] ['c.py', 'b.txt', 'a.txt'] >>> [file for file in os.listdir('.') if fnmatch.fnmatch(file, '[!a-c]*')] ['test.py']
fnmatchcase 函數(shù)與 fnmatch 函數(shù)幾乎一樣,只是在匹配的時候會忽略大小寫字母;filter 函數(shù)與 fnmatch 比較類似,區(qū)別在于fnmatch 一次只對一個文件名匹配,而 filter 一次可以對多個文件名進(jìn)行匹配判斷,下面我們就再來看一下 filter 的用法:
>>> import os >>> import fnmatch >>> file = os.listdir('.') >>> file ['test.py', 'c.py', 'b.txt', 'a.txt'] >>> fnmatch.filter(file, '[a-c]*') ['c.py', 'b.txt', 'a.txt'] >>> fnmatch.filter(file, '[!a-c]*') ['test.py']
2.使用 glob 定位
我們在上面介紹的獲取特定類型的文件列表,首先是通過 os.listdir 獲取全部的文件列表,然后通過字符串匹配或者使用 fnmatch 進(jìn)行文件名模式匹配來定位,習(xí)慣了 Python 的簡潔優(yōu)雅,這多出來的一步總覺得哪里怪怪的,好在我現(xiàn)在知道了 glob。
glob 的作用相當(dāng)于 os.listdir + fnmatch 的組合,使用 glob 以后,就不需要用 os.listdir 獲取文件列表,直接通過模式匹配就可以解決了,具體操作如下所示:
>>> import glob >>> glob.glob('*.txt') ['b.txt', 'a.txt'] >>> glob.glob('[a-c]*') ['c.py', 'b.txt', 'a.txt'] >>> glob.glob('[!a-c]*') ['test.py']
可以看到,Python 真的非常的靈活,光是定位目錄下特定的文件類型我就已經(jīng)介紹了 3 種方式,一般情況下就用字符串匹配就可以解決,如果需要更加靈活一點(diǎn)的的,可以使用 fnmatch 和 glob。
遍歷目錄樹
再上一節(jié)中我們都是查找某個目錄下的文件然后通過匹配去定位自己需要的文件類型。但是在實(shí)際的應(yīng)用過程中我們更可能遇到的是某個目錄及其子目錄下的所有文件。比如查找某個目錄及其子目錄下所有的 txt 文件等等,對于這類的需求,我們可以使用 os 模塊下的「walk」函數(shù)。walk 函數(shù)遍歷某個目錄及其子目錄,對于每一個目錄,walk 返回一個三元組,依次是「當(dāng)前目錄」,「當(dāng)前目錄下的子目錄」,「當(dāng)前目錄下的文件列表」。
下面我們來演示一下 os.walk 函數(shù)的用法,做一個小的練習(xí),來遍歷一下 /root/rocky0429 目錄及其子目錄下的所有 txt 和 圖片文件:
import os import fnmatch search = ['*.txt', '*.jpg', '*.jpeg'] res = [] for root, dirnames, filenames in os.walk(os.path.expanduser('~/rocky0429')): for extension in search: for filename in fnmatch.filter(filenames, extension): res.append(os.path.join(root,filename)) print(res)
以上就是Python 如何查找特定類型文件的詳細(xì)內(nèi)容,更多關(guān)于python 查找文件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python+selenium+PhantomJS抓取網(wǎng)頁動態(tài)加載內(nèi)容
一般我們使用python的第三方庫requests及框架scrapy來爬取網(wǎng)上的資源,但是設(shè)計(jì)javascript渲染的頁面卻不能抓取,此 時,我們使用web自動化測試化工具Selenium+無界面瀏覽器PhantomJS來抓取javascript渲染的頁面,下面實(shí)現(xiàn)一個簡單的爬取2020-02-02Pycharm導(dǎo)入anaconda環(huán)境的教程圖解
這篇文章主要介紹了Pycharm導(dǎo)入anaconda環(huán)境的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07python 隨機(jī)生成10位數(shù)密碼的實(shí)現(xiàn)代碼
這篇文章主要介紹了python 隨機(jī)生成10位數(shù)密碼的實(shí)現(xiàn)代碼,在文中給大家提到了生成隨機(jī)密碼要實(shí)現(xiàn)的功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-06-06python實(shí)點(diǎn)云分割k-means(sklearn)詳解
這篇文章主要為大家詳細(xì)介紹了Python實(shí)點(diǎn)云分割k-means,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-05-05python的scikit-learn將特征轉(zhuǎn)成one-hot特征的方法
今天小編就為大家分享一篇python的scikit-learn將特征轉(zhuǎn)成one-hot特征的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07人工智能學(xué)習(xí)Pytorch數(shù)據(jù)集分割及動量示例詳解
這篇文章主要為大家介紹了人工智能學(xué)習(xí)Pytorch數(shù)據(jù)集分割及動量示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11python導(dǎo)出chrome書簽到markdown文件的實(shí)例代碼
python導(dǎo)出chrome書簽到markdown文件,主要就是解析chrome的bookmarks文件,然后拼接成markdown格式的字符串,最后輸出到文件即可。下面給大家分享實(shí)例代碼,需要的朋友參考下2017-12-12