Python利用glob庫實(shí)現(xiàn)輕松應(yīng)對(duì)文件和目錄管理
導(dǎo)言
在Python編程中,我們經(jīng)常需要處理文件和目錄。為了更便捷地處理這些任務(wù),Python提供了glob
庫,它允許我們根據(jù)特定模式匹配文件和目錄。本篇博客將詳細(xì)介紹glob
庫的用法,并通過實(shí)例演示它的各種功能。
什么是glob庫
glob
庫是Python標(biāo)準(zhǔn)庫中的一個(gè)模塊,它提供了一個(gè)簡單而強(qiáng)大的方法來匹配文件和目錄的路徑名。通常情況下,我們?cè)诿钚兄惺褂猛ㄅ浞麃硭阉魑募?,例?code>*.txt表示匹配所有以.txt
為后綴的文件。glob
庫允許我們以編程的方式在Python腳本中執(zhí)行類似的文件匹配操作。
glob
庫的主要方法是glob()
函數(shù),該函數(shù)接受一個(gè)模式字符串作為輸入,并返回與該模式匹配的所有文件和目錄的列表。
安裝glob庫
在大多數(shù)情況下,Python已經(jīng)預(yù)裝了glob
庫,因此你不需要額外安裝。如果你的Python環(huán)境中沒有glob
庫,可以使用以下命令來安裝:
pip install glob2
現(xiàn)在讓我們開始探索glob
庫的各種功能。
基本使用方法
導(dǎo)入glob庫
在使用glob
庫之前,首先需要導(dǎo)入它。在Python中,我們使用import
語句來導(dǎo)入模塊:
import glob
使用通配符匹配文件
glob
庫使用通配符來匹配文件和目錄。下面是一些常用的通配符:
*
:匹配0個(gè)或多個(gè)字符。?
:匹配單個(gè)字符。[]
:匹配指定范圍內(nèi)的字符,如[0-9]
匹配所有數(shù)字字符。
讓我們來看一個(gè)例子。假設(shè)我們有一個(gè)文件夾data
,其中包含以下文件:
data/ file1.txt file2.txt image.jpg data.csv
現(xiàn)在,我們想要匹配所有以.txt
為后綴的文件。我們可以使用*.txt
作為模式字符串:
txt_files = glob.glob("data/*.txt") print(txt_files)
輸出:
['data/file1.txt', 'data/file2.txt']
正如我們所見,glob.glob()
函數(shù)返回了一個(gè)列表,其中包含了所有以.txt
為后綴的文件路徑。
匹配特定目錄
如果我們希望匹配的文件在子目錄中,我們可以使用雙星號(hào)**
來進(jìn)行遞歸搜索。例如,假設(shè)我們有以下文件結(jié)構(gòu):
data/ file1.txt subdir/ file2.txt file3.txt
我們想要匹配所有以.txt
為后綴的文件,不論它們位于哪個(gè)子目錄中。我們可以使用**/*.txt
作為模式字符串:
txt_files_recursive = glob.glob("data/**/*.txt", recursive=True) print(txt_files_recursive)
輸出:
['data/file1.txt', 'data/subdir/file2.txt', 'data/subdir/file3.txt']
使用recursive=True
參數(shù),我們可以匹配到所有子目錄中的文件。
匹配多種后綴
有時(shí)候我們需要匹配多種后綴的文件,可以使用[]
來指定匹配的范圍。例如,如果我們想要匹配.txt
和.csv
文件,我們可以使用["*.txt", "*.csv"]
作為模式字符串:
txt_and_csv_files = glob.glob("data/*.[txt|csv]") print(txt_and_csv_files)
輸出:
['data/file1.txt', 'data/file2.txt', 'data/data.csv']
獲取目錄列表
除了匹配文件,glob
庫還可以獲取目錄列表。如果我們想要列出所有子目錄,可以使用*/
作為模式字符串:
subdirs = glob.glob("data/*/") print(subdirs)
輸出:
['data/subdir/']
使用iglob()進(jìn)行迭代
對(duì)于大型目錄,一次性獲取所有匹配的文件列表可能會(huì)占用大量內(nèi)存。在這種情況下,可以使用iglob()
函數(shù)來進(jìn)行迭代獲取。iglob()
返回一個(gè)迭代器,逐個(gè)返回匹配的文件名。
txt_files_iterator = glob.iglob("data/*.txt") for file in txt_files_iterator: print(file)
輸出:
data/file1.txt
data/file2.txt
iglob()
適用于處理大量文件時(shí),可以節(jié)省內(nèi)存開銷。
過濾和排序匹配結(jié)果
在上面的例子中,我們看到glob.glob()
返回匹配模式的所有文件和目錄列表。然而,有時(shí)候我們可能只對(duì)某些特定的文件感興趣,或者希望按照一定規(guī)則對(duì)匹配結(jié)果進(jìn)行排序。glob
庫提供了一些方法來實(shí)現(xiàn)這些需求。
過濾匹配結(jié)果
glob
庫允許我們使用fnmatch
模塊的匹配方法來過濾匹配結(jié)果。這對(duì)于在匹配結(jié)果中執(zhí)行更復(fù)雜的模式匹配非常有用。例如,假設(shè)我們只想匹配以file
開頭的文件:
import glob import fnmatch # 獲取所有以'file'開頭的文件 file_starting_with_file = fnmatch.filter(glob.glob("data/*"), "file*") print(file_starting_with_file)
輸出:
['data/file1.txt', 'data/file2.txt']
在這個(gè)例子中,我們使用fnmatch.filter()
方法來從匹配結(jié)果中過濾以file
開頭的文件。
排序匹配結(jié)果
glob
庫返回的匹配結(jié)果通常是按照操作系統(tǒng)的文件系統(tǒng)規(guī)則排序的。但是,有時(shí)候我們可能需要按照自定義的方式對(duì)匹配結(jié)果進(jìn)行排序。在這種情況下,我們可以使用Python的內(nèi)置sorted()
函數(shù)來對(duì)匹配結(jié)果進(jìn)行排序。
例如,假設(shè)我們想按照文件大小對(duì)匹配的文件進(jìn)行排序:
import glob import os # 獲取匹配的文件并按照文件大小排序 matched_files = glob.glob("data/*.txt") sorted_files_by_size = sorted(matched_files, key=os.path.getsize) print(sorted_files_by_size)
輸出:
['data/file1.txt', 'data/file2.txt']
在這個(gè)例子中,我們使用os.path.getsize()
函數(shù)作為sorted()
函數(shù)的key
參數(shù),從而按照文件大小對(duì)匹配結(jié)果進(jìn)行排序。
自定義匹配規(guī)則
glob
庫允許我們使用自定義函數(shù)來對(duì)匹配結(jié)果進(jìn)行過濾和排序。例如,假設(shè)我們想要匹配所有以奇數(shù)數(shù)字結(jié)尾的文件,并按照數(shù)字大小進(jìn)行排序:
import glob # 自定義過濾函數(shù) def custom_filter(file_path): filename = file_path.split("/")[-1] last_char = filename[-5] # 獲取倒數(shù)第5個(gè)字符,即文件名中的最后一個(gè)數(shù)字 return last_char.isdigit() and int(last_char) % 2 == 1 # 獲取匹配的文件并按照自定義規(guī)則排序 matched_files = glob.glob("data/*") filtered_and_sorted_files = sorted(filter(custom_filter, matched_files)) print(filtered_and_sorted_files)
輸出:
['data/file1.txt']
在這個(gè)例子中,我們定義了一個(gè)custom_filter()
函數(shù)來過濾以奇數(shù)數(shù)字結(jié)尾的文件,并使用sorted()
函數(shù)按照自定義規(guī)則進(jìn)行排序。
遍歷子目錄中的文件
前面我們介紹了使用**
來進(jìn)行遞歸搜索,但如果你只希望遍歷子目錄中的文件而不進(jìn)一步進(jìn)入子目錄,可以使用glob.glob()
結(jié)合os.path.join()
來實(shí)現(xiàn)。
例如,假設(shè)我們有以下文件結(jié)構(gòu):
data/
file1.txt
subdir1/
file2.txt
file3.txt
subdir2/
file4.txt
現(xiàn)在我們只想遍歷data
目錄及其直接子目錄中的所有文件:
import glob import os def list_files_in_directory(directory): files = [] for file_path in glob.glob(os.path.join(directory, "*")): if os.path.isfile(file_path): files.append(file_path) return files directory_path = "data" files_in_directory = list_files_in_directory(directory_path) print(files_in_directory)
輸出:
['data/file1.txt', 'data/subdir1/file2.txt', 'data/subdir1/file3.txt', 'data/subdir2/file4.txt']
在這個(gè)例子中,我們定義了一個(gè)list_files_in_directory()
函數(shù),該函數(shù)遍歷指定目錄中的文件,并忽略子目錄。使用os.path.join()
函數(shù)來構(gòu)建文件路徑,確保可以正確處理不同操作系統(tǒng)下的路徑分隔符。
使用glob庫進(jìn)行文件處理
glob
庫不僅僅用于匹配和獲取文件列表,還可以方便地進(jìn)行文件處理。我們可以將glob
庫與其他Python庫(例如os
、shutil
等)結(jié)合使用,來執(zhí)行各種文件操作。
復(fù)制文件
假設(shè)我們想將所有以.txt
為后綴的文件復(fù)制到另一個(gè)目錄中,我們可以使用shutil
庫來實(shí)現(xiàn):
import glob import shutil source_directory = "data" destination_directory = "backup" txt_files = glob.glob(os.path.join(source_directory, "*.txt")) for txt_file in txt_files: shutil.copy(txt_file, destination_directory)
在這個(gè)例子中,我們首先使用glob
庫來獲取所有以.txt
為后綴的文件列表,然后使用shutil.copy()
函數(shù)將這些文件復(fù)制到backup
目錄中。
刪除文件
如果我們希望刪除所有以.csv
為后綴的文件,可以使用os.remove()
函數(shù)來實(shí)現(xiàn):
import glob csv_files = glob.glob("data/*.csv") for csv_file in csv_files: os.remove(csv_file)
在這個(gè)例子中,我們使用glob
庫來獲取所有以.csv
為后綴的文件列表,然后使用os.remove()
函數(shù)來刪除這些文件。
批量重命名文件
glob
庫與字符串處理和os.rename()
函數(shù)結(jié)合使用,可以批量重命名文件。假設(shè)我們有一系列文件名格式為file_<num>.txt
(例如file_1.txt
、file_2.txt
等),現(xiàn)在我們希望將它們重命名為data_<num>.txt
:
import glob import os files_to_rename = glob.glob("data/file_*.txt") for old_file_path in files_to_rename: new_file_path = old_file_path.replace("file_", "data_") os.rename(old_file_path, new_file_path)
在這個(gè)例子中,我們首先使用glob
庫獲取所有需要重命名的文件,然后使用字符串的replace()
方法將file_
替換為data_
,最后使用os.rename()
函數(shù)進(jìn)行重命名。
使用glob庫的注意事項(xiàng)
雖然glob
庫是一個(gè)功能強(qiáng)大的工具,但在使用時(shí)還有一些注意事項(xiàng):
- 在使用
glob
庫時(shí),應(yīng)該謹(jǐn)慎處理用戶提供的輸入,以避免路徑遍歷攻擊(Path Traversal Attack)。 - 使用
glob
庫時(shí)要注意平臺(tái)兼容性,特別是在處理路徑分隔符時(shí)。建議使用os.path.join()
來構(gòu)建文件路徑,以確保在不同操作系統(tǒng)上都能正確運(yùn)行。 - 對(duì)于大型目錄和大量文件的處理,使用
iglob()
或者配合生成器(generator)等方法,可以避免不必要的內(nèi)存開銷。
結(jié)語
glob
庫提供了一個(gè)簡單而強(qiáng)大的方法來管理文件和目錄,讓我們可以輕松地在Python腳本中處理文件。通過掌握glob
庫的使用,我們可以更高效地編寫Python程序,并在實(shí)際項(xiàng)目中應(yīng)用它們。
以上就是Python利用glob庫實(shí)現(xiàn)輕松應(yīng)對(duì)文件和目錄管理的詳細(xì)內(nèi)容,更多關(guān)于Python glob庫的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python遠(yuǎn)程創(chuàng)建docker容器的方法
這篇文章主要介紹了Python遠(yuǎn)程創(chuàng)建docker容器的方法,如果docker??ps找不到該容器,可以使用?docker?ps?-a查看所有的,然后看剛才創(chuàng)建的容器的STATUS是EXIT0還是EXIT1如果是1,那應(yīng)該是有報(bào)錯(cuò),使用?docker?logs?容器id命令來查看日志,根據(jù)日志進(jìn)行解決,需要的朋友可以參考下2024-04-04Python?獲取今天任意時(shí)刻的時(shí)間戳的方法
本文主要介紹了Python?獲取今天任意時(shí)刻的時(shí)間戳的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>2022-06-06Flask框架學(xué)習(xí)筆記之消息提示與異常處理操作詳解
這篇文章主要介紹了Flask框架學(xué)習(xí)筆記之消息提示與異常處理操作,結(jié)合實(shí)例形式分析了flask框架表單登陸消息提示、錯(cuò)誤模板調(diào)用及異常處理相關(guān)操作技巧,需要的朋友可以參考下2019-08-08pytorch深度神經(jīng)網(wǎng)絡(luò)入門準(zhǔn)備自己的圖片數(shù)據(jù)
這篇文章主要為大家介紹了pytorch深度神經(jīng)網(wǎng)絡(luò)入門準(zhǔn)備自己的圖片數(shù)據(jù)示例過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06通過實(shí)例了解Python異常處理機(jī)制底層實(shí)現(xiàn)
這篇文章主要介紹了通過實(shí)例了解Python異常處理機(jī)制底層實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07Python安裝Numpy和matplotlib的方法(推薦)
下面小編就為大家?guī)硪黄狿ython安裝Numpy和matplotlib的方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11python實(shí)戰(zhàn)之用emoji表情生成文字
這篇文章主要介紹了python實(shí)戰(zhàn)之用emoji表情生成文字,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有很好地幫助,需要的朋友可以參考下2021-05-05使用Flask開發(fā)RESTful?API的方法實(shí)現(xiàn)
RESTful?API是一種基于REST架構(gòu)風(fēng)格設(shè)計(jì)的Web服務(wù)接口,本文主要介紹了使用Flask開發(fā)RESTful?API的方法實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11