網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
該章節(jié)將學(xué)習(xí)關(guān)于文件查找的操作,大家都知道,無(wú)論是 Linux 系統(tǒng)還是 Windows 系統(tǒng)都有基于文件名實(shí)現(xiàn)過(guò)濾、查找的功能。但是如果想要查找一些關(guān)于某些文件指定內(nèi)容的文件,好像無(wú)論是 Linux 還是 Windows 明面上沒(méi)有這樣的功能了。這個(gè)時(shí)候就可以通過(guò) Python 來(lái)實(shí)現(xiàn)這樣的功能,通過(guò)該章節(jié)的學(xué)習(xí),就可以學(xué)習(xí)到該功能的如何利用 Python 實(shí)現(xiàn)這樣的操作。
文件查找操作
glob 的介紹
glob 包是一個(gè)快速查找文件夾中內(nèi)容的包,可以通過(guò)模糊查找的形式找到我們想要的內(nèi)容。
glob 的基本使用
導(dǎo)入包與模塊
from glob import glob
使用方法
glob(任意目錄)
返回內(nèi)容:
指定路徑下的內(nèi)容列表,不存在的路徑返回空列表。
代碼示例如下:
# coding:utf-8
import os
from glob import glob
target = os.getcwd()
result = glob(target)
print(result) # 打印輸出當(dāng)前路徑的文件夾
result = glob(target + '/*')
print(result) # 打印輸出當(dāng)前路徑的文件夾下的所有文件
result = glob(target + '/*.py')
print(result) # 打印輸出當(dāng)前路徑的文件夾下的所有以 "py" 結(jié)尾的文件
result = glob(target + '/*.zip')
print(result) # 打印輸出當(dāng)前路徑的文件夾下的所有以 "zip" 結(jié)尾的文件
result = glob(target + '/filetest*')
print(result) # # 打印輸出當(dāng)前路徑的文件夾下的所有以 "filetest" 開(kāi)頭的文件
運(yùn)行結(jié)果如下:
查找指定的文件
已知條件:
想查找的文件名已經(jīng)知道,但是目錄在哪里并不知道。
實(shí)現(xiàn)方法:
利用 "glob" 從最上級(jí)目錄開(kāi)始查找,利用遞歸模式,不斷的查找,直到找到為止。
代碼示例如下:
# coding:utf-8
import glob
"""
獲取當(dāng)前路徑下所有內(nèi)容
判斷每個(gè)內(nèi)容的類型(文件夾還是文件)
若是文件夾則繼續(xù)遞歸查找
"""
path = glob.os.path.join(glob.os.getcwd(), '*') # 獲取當(dāng)前文件夾下的所有內(nèi)容
# glob 模塊其實(shí)已經(jīng)包含了 "os" 模塊
final_result = [] # 定義一個(gè)空列表,用以存儲(chǔ) search() 函數(shù)查到的內(nèi)容
def search(path, target): # 定義 search() 函數(shù),傳入 "path" 文件路徑, "target" 要查找的目標(biāo)文件
result = glob.glob(path)
for data in result: # for 循環(huán)判斷遞歸查到的內(nèi)容是文件夾還是文件
if glob.os.path.isdir(data): # 若是文件夾,繼續(xù)將該文件夾的路徑傳給 search() 函數(shù)繼續(xù)遞歸查找
_path = glob.os.path.join(data, '*')
search(_path, target)
else: # 若是文件,則將該查詢到的文件所在路徑插入 final_result 空列表
if target in data:
final_result.append(data)
return final_result
if __name__ == '__main__':
result = search(path, target='filetest.py')
print(result)
運(yùn)行結(jié)果如下:
基于文件內(nèi)容查找文件
接下來(lái)我們看一下查找指定內(nèi)容的文件:
已知條件:
文件中包含有某些關(guān)鍵字,但是不知道文件名和文件所在路徑
實(shí)現(xiàn)方法:
利用 "glob" 從最上級(jí)目錄開(kāi)始查找,利用遞歸模式,不斷的查找。如果是文件夾則進(jìn)入繼續(xù)查找,是文件則讀取,判斷是否包含該內(nèi)容,返回該內(nèi)容的文件名以及所在路徑。
其實(shí),基于文件內(nèi)容查找文件實(shí)現(xiàn)的方式大體與上文的查找指定文件大體相似,只不過(guò)加入了讀取文件的判斷罷了。
代碼示例如下:
# coding:utf-8
import glob
"""
獲取當(dāng)前路徑下所有內(nèi)容
判斷每個(gè)內(nèi)容的類型(文件夾還是文件)
若是文件夾則繼續(xù)遞歸查找
"""
path = glob.os.path.join(glob.os.getcwd(), '*test04') # 因?yàn)橄挛牟东@不可讀文件格式太多,所以這里直接指定了 "test04" 路徑
final_result = [] # 定義一個(gè)空列表,用以存儲(chǔ) search() 函數(shù)查到的內(nèi)容
def search(path, target): # 定義 search() 函數(shù),傳入 "path" 文件路徑, "target" 要查找的目標(biāo)文件
result = glob.glob(path)
for data in result: # for 循環(huán)判斷遞歸查到的內(nèi)容是文件夾還是文件
if glob.os.path.isdir(data): # 若是文件夾,繼續(xù)將該文件夾的路徑傳給 search() 函數(shù)繼續(xù)遞歸查找
_path = glob.os.path.join(data, '*')
search(_path, target)
else: # 若是文件,則將該查詢到的文件所在路徑插入 final_result 空列表
f = open(data, 'r') # 利用 open() 函數(shù)讀取文件,并通過(guò) try...except... 捕獲不可讀的文件格式(.zip 格式)
try:
content = f.read()
if target in content:
final_result.append(data)
except:
print('這是不可讀文件格式的文件的所在路徑:{} '.format(data))
continue
finally:
f.close()
return final_result
if __name__ == '__main__':
result = search(path, target='測(cè)試文件')
print(result)
運(yùn)行結(jié)果如下:
原文鏈接:https://blog.csdn.net/weixin_42250835/article/details/124621368
相關(guān)推薦
- 2023-03-27 基于Unity3D實(shí)現(xiàn)仿真時(shí)鐘詳解_C#教程
- 2023-01-07 Flutter?Dart快速排序算法示例詳解_Dart
- 2022-06-17 go語(yǔ)言beego框架分頁(yè)器操作及接口頻率限制示例_Golang
- 2022-06-20 基于C#實(shí)現(xiàn)語(yǔ)音識(shí)別功能詳解_C#教程
- 2022-06-09 Nginx速查手冊(cè)及常見(jiàn)問(wèn)題_nginx
- 2023-03-15 Android?Studio格式化(Format)代碼快捷鍵介紹_Android
- 2022-08-30 MongoDB數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)整理_MongoDB
- 2022-07-04 python設(shè)計(jì)模式之裝飾器模式_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支