Python實例題:文件內容搜索工具

目錄

Python實例題

題目

要求:

解題思路:

代碼實現:

Python實例題

題目

文件內容搜索工具

要求

  • 實現一個命令行工具,用于在指定目錄下搜索包含特定文本的文件。
  • 支持以下功能:
    • 遞歸搜索子目錄
    • 區分大小寫 / 不區分大小寫搜索
    • 搜索特定文件類型(如 .txt、.py)
    • 顯示匹配行號和上下文
    • 統計匹配文件數和匹配行數
  • 添加進度顯示和結果高亮功能。

解題思路

  • 使用?os.walk?遞歸遍歷目錄。
  • 通過正則表達式實現文本匹配。
  • 利用 ANSI 轉義碼實現終端文本高亮。

代碼實現

import os
import re
import argparse
from pathlib import Path
from termcolor import colored
import progressbardef search_file(file_path, search_text, case_sensitive=True, context_lines=0):"""在單個文件中搜索文本,返回匹配結果"""matches = []try:with open(file_path, 'r', encoding='utf-8') as f:lines = f.readlines()for line_num, line in enumerate(lines, 1):if case_sensitive:if search_text in line:matches.append((line_num, line.strip()))else:if search_text.lower() in line.lower():matches.append((line_num, line.strip()))# 添加上下文if context_lines > 0 and matches:result_with_context = []for line_num, line in matches:start = max(1, line_num - context_lines)end = min(len(lines), line_num + context_lines)context = []for i in range(start, end + 1):context_line = lines[i-1].strip()is_match = i == line_numcontext.append((i, context_line, is_match))result_with_context.append(context)return result_with_contextelse:return [(m[0], [m]) for m in matches]except (UnicodeDecodeError, PermissionError) as e:print(f"無法讀取文件 {file_path}: {e}")return []def search_directory(root_dir, search_text, file_extensions=None, case_sensitive=True, recursive=True, context_lines=0, progress_callback=None):"""在目錄中搜索包含特定文本的文件"""total_matches = []file_count = 0match_count = 0# 準備文件擴展名篩選器if file_extensions:file_extensions = [ext.lower() if ext.startswith('.') else f'.{ext}' for ext in file_extensions]# 遍歷目錄for root, _, files in os.walk(root_dir):for filename in files:if file_extensions and not any(filename.lower().endswith(ext) for ext in file_extensions):continuefile_path = os.path.join(root, filename)matches = search_file(file_path, search_text, case_sensitive, context_lines)if matches:total_matches.append((file_path, matches))match_count += len(matches)file_count += 1if progress_callback:progress_callback()if not recursive:breakreturn total_matches, file_count, match_countdef highlight_text(text, search_text, case_sensitive=True):"""高亮顯示匹配的文本"""if not case_sensitive:pattern = re.compile(re.escape(search_text), re.IGNORECASE)else:pattern = re.compile(re.escape(search_text))return pattern.sub(colored(r'\g<0>', 'red', attrs=['bold']), text)def main():parser = argparse.ArgumentParser(description='文件內容搜索工具')parser.add_argument('directory', help='搜索目錄')parser.add_argument('search_text', help='要搜索的文本')parser.add_argument('-e', '--extensions', nargs='+', help='限制搜索的文件擴展名,例如: txt py')parser.add_argument('-i', '--ignore-case', action='store_true', help='忽略大小寫')parser.add_argument('-r', '--recursive', action='store_true', help='遞歸搜索子目錄')parser.add_argument('-c', '--context', type=int, default=0, help='顯示匹配行的上下文行數')args = parser.parse_args()# 驗證目錄是否存在if not os.path.isdir(args.directory):print(f"錯誤: 目錄 '{args.directory}' 不存在")return# 計算總文件數用于進度顯示total_files = 0for root, _, files in os.walk(args.directory):if args.extensions:files = [f for f in files if any(f.lower().endswith(ext) for ext in args.extensions)]total_files += len(files)if not args.recursive:breakprint(f"在目錄 '{args.directory}' 中搜索 '{args.search_text}'...")print(f"總文件數: {total_files}")# 創建進度條widgets = ['搜索進度: ', progressbar.Percentage(),' ', progressbar.Bar(marker='█', fill='-'),' ', progressbar.ETA()]bar = progressbar.ProgressBar(max_value=total_files, widgets=widgets).start()progress_counter = [0]  # 使用列表以便在閉包中修改def update_progress():progress_counter[0] += 1bar.update(progress_counter[0])# 執行搜索matches, file_count, match_count = search_directory(args.directory, args.search_text, args.extensions, not args.ignore_case, args.recursive, args.context,update_progress)bar.finish()# 顯示結果print(f"\n搜索完成!")print(f"匹配文件數: {file_count}")print(f"匹配行數: {match_count}")if matches:print("\n匹配結果:")for file_path, file_matches in matches:print(f"\n{colored(file_path, 'blue', attrs=['underline'])}")for context in file_matches:for line_num, line_text, is_match in context:prefix = colored(f"{line_num:>5} | ", 'cyan')if is_match:line_text = highlight_text(line_text, args.search_text, not args.ignore_case)print(prefix + colored(line_text, 'yellow'))else:print(prefix + line_text)else:print("\n沒有找到匹配的內容。")if __name__ == "__main__":main()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912081.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912081.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912081.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Pandas】pandas DataFrame resample

Pandas2.2 DataFrame Time Series-related 方法描述DataFrame.asfreq(freq[, method, how, …])用于**將時間序列數據轉換為指定頻率&#xff08;resample to frequency&#xff09;**的方法DataFrame.asof(where[, subset])用于查找時間序列中最接近指定時間點的非 NaN 值的…

自動駕駛nuPlan數據集-入門使用和可視化操作

文章目錄 前言一、nuPlan 數據集下載及環境安裝根據個人安裝的路徑將以下內容寫入./bashrc 中二、跑通場景可視化總結 前言 自動駕駛行業知識點太多&#xff0c;不進則退&#xff0c;上班就得學習&#xff0c;天上掉金磚砸我腳好了 參考文檔 參考&#xff11; 一、nuPlan 數據…

ApplovinMax接入Unity(包括我自己踩的一些坑)

前言 ApplovinMax是一個廣告聚合平臺&#xff0c;他會自帶自己的Applovin平臺廣告&#xff0c;在這個插件上面你可以下載其他的聚合渠道&#xff0c;與谷歌的Admob比較相似。都是廣告聚合平臺。 一. ApplovinMax SDK插件的導入 1.下載插件集成 | SDK 集成指南 | MAX | Suppo…

linux系統執行過程中的5種特殊情況

正在執行的用戶態X切換用戶態進程Y的過程為系統中常用的情況&#xff0c;但并非不能完全準確地反應系統的全部執行場景&#xff0c;還有一些場景比較特殊&#xff0c;主要包括以下5種情況 一.內核線程之間通過中斷處理過程中的調度時機發生進程切換&#xff0c;與一般的情況非常…

9. 元素拖拽

元素拖拽 API 介紹 1. 拖放過程 整個拖放過程中&#xff0c;存在兩個關鍵元素&#xff1a;拖拽元素、放置元素 拖拽元素&#xff1a;被拖拽的元素 drag&#xff1a;元素被拖拽時觸發&#xff0c;從開始拖拽到拖拽結束前整個過程會一直持續的觸發dragstart&#xff1a;元素被…

用來提升同花順軟件進程優先級的C#程序

為了提高炒股軟件同花順的運行速度&#xff0c;消除卡頓&#xff0c;編寫一個C#程序&#xff0c;來設置同花順進程的優先級。 using System; using System.Diagnostics; using System.Security.Principal;namespace ProcessPrioritySetter {class Program{static void Main(st…

linux初階---一些指令

一.快速認識6-8個簡單指令 1.pwd pwd指令是用來查看用戶當前所處在的目錄&#xff08;目錄的概念在理解上可以等效為文件夾&#xff09;。 &#xff08;1&#xff09;在windows系統中我們通過文件路徑表示唯一的文件&#xff0c;在linux中也是一樣的&#xff0c;所以pwd是一個很…

全國產傳感器外殼的綜合分析:材料選擇、考量因素與尺寸精度影響

全國產傳感器作為現代工業、科研、生活等領域的 “感知觸角”&#xff0c;其外殼的性能與質量直接關乎設備的穩定性、可靠性與使用壽命。從材料選型、關鍵考量因素到尺寸精度的影響&#xff0c;每個環節都需精細把控。 一、全國產傳感器外殼材料的多元選擇 全國產傳感器外殼材…

本地緩存Caffeine詳解(含與Spring Cache集成)

目錄 一、介紹 二、Caffeine核心原理與架構設計 2.1 存儲引擎與數據結構 2.2 緩存淘汰策略 2.3 并發控制機制 三、入門案例 3.1 引入依賴 3.2 測試接口 3.3 小結 四、Caffeine常用方法詳解 4.1 getIfPresent 4.2 get 4.3 put 4.4 putAll 4.5 invalidate 4.6 inv…

論特定領域軟件架構

20250413-作 題目 特定領域軟件架構DSSA&#xff08;Domain Specific Software Architecture&#xff09;就是在一個特定應用領域中為一組應用提供組織結構參考的標準軟件體系結構。對DSSA 研究的角度、關心的問題不同導致了對DSSA 的不同定義。DSSA 的必備特征如下。 一…

iOS 遠程調試與離線排查實戰:構建非現場問題復現機制

iOS開發者都知道&#xff0c;調試最怕兩個字&#xff1a;“偶發”。用戶說App閃退了&#xff0c;你點了十遍也沒問題&#xff1b;測試說功能卡頓了&#xff0c;你抓日志時它又順滑如新。最麻煩的是&#xff0c;這種“現場問題”往往在你連接不到用戶設備時發生。 面對這種情況…

SpringBoot -- 整合 Swagger3

8.SpringBoot3 整合 Swagger3 由于目前主流的開發模式是前后端分離開發。所以前后端的交互需要通過一個 API&#xff08;開發接口&#xff09; 來規范。而這個接口的開發是由后端程序員編寫的。“網站式 API 文檔” 1.導入依賴 <!-- 引入swagger3(springdoc)的依賴--> …

A Machine Learning Approach for Non-blind Image Deconvolution論文閱讀

A Machine Learning Approach for Non-blind Image Deconvolution 1. 研究目標與實際意義2. 創新方法與模型設計2.1 核心思路2.2 正則化反演:理論與公式2.2.1 退化模型2.2.2 正則化目標函數2.2.3 傅里葉域閉式解2.3 MLP去偽影:架構與訓練2.3.1 MLP架構設計2.3.2 訓練流程2.3.…

微信小程序<rich-text>支持里面圖片點擊放大

使用<rich-text>渲染類似下面的html代碼&#xff1a; <div stylecolor: red>寵物友好<br/>xxx提供寵物友好服務&#xff0c;具體請見下圖<br/></div> <img srchttps://xxx.com/xxx1.png width100%/> <img srchttps://xxx.com/xxx2.png…

BVH 文件是一種用于記錄 3D 動畫數據的文件格式,常用于 3D 建模和動畫制作。以下是對這個 BVH 文件的逐行解讀

BVH 文件是一種用于記錄 3D 動畫數據的文件格式&#xff0c;常用于 3D 建模和動畫制作。以下是對這個 BVH 文件的逐行解讀&#xff1a; HIERARCHY ROOT Hips { OFFSET 0 0 0 CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation JOINT LeftUpLeg { OFFSE…

C語言開發:Onvif(一)

根據ONVIF官網 的介紹&#xff1a; ONVIF是一個開放的安防行業組織&#xff0c;致力于為安防行業提供和促進標準化開放接口&#xff0c;以實現IP網絡安防產品和服務的有效互操作性。 在具體實現上&#xff0c;ONVIF使用了Web Service的方式&#xff0c;設備通過WSDL定義的接口…

中科米堆三維掃描儀耳機3D掃描尺寸測量數字化建模

當下&#xff0c;耳機已從單純的音頻輸出設備進化為集娛樂、健康、辦公于一體的智能穿戴終端。相關數據顯示&#xff0c;2025年全球智能個人音頻設備出貨量突破4.55億臺&#xff0c;中國以22%的增速領跑全球&#xff0c;其中開放式耳機&#xff08;OWS&#xff09;出貨量占比達…

學習接口自動化框架pytest有哪些好處?

學習 pytest 作為接口自動化測試框架&#xff0c;具有以下顯著優勢&#xff0c;能大幅提升測試效率和質量&#xff1a; Pytest自動化測試教程&#xff0c;自動化必備之Pytest測試框架訓練營&#xff0c;只需一小時速成&#xff0c;學會直接上手實操&#xff01; 1. 代碼簡潔&…

LinuxBridge的作用與發展歷程:從基礎橋接到云原生網絡基石

LinuxBridge作為Linux網絡虛擬化的核心組件&#xff0c;已悄然支撐互聯網基礎設施20余年。它不僅是虛擬機網絡連接的橋梁&#xff0c;更是容器網絡、云原生架構的隱形支柱。 一、LinuxBridge的核心作用剖析 1. 二層網絡虛擬化的實現者 本質功能&#xff1a;模擬物理交換機行為…

探討 SYSCFG 時鐘對 ADC 采樣的影響

探討 SYSCFG 時鐘對 ADC 采樣的影響 在嵌入式系統開發中&#xff0c;對于 GD32F4 系列微控制器&#xff0c;理解 SYSCFG 時鐘與 ADC 采樣之間的關系至關重要。 以下是詳細分析&#xff1a; 一、SYSCFG 時鐘對 ADC 采樣過程的基礎性作用 1. 提供采樣時鐘信號 ADC 采樣需要時鐘…